mauce 发表于 2005-11-24 15:34

问一个MySQL的问题,谢谢了

问一个MySQL的问题,谢谢了
小弟我在做软件开发的实践课,现在比如说是ATM自动取款机,银行可以给一个客户一张银行卡,那个客户的家人可以申请得到一张Partnercard。这两张卡有这同一个银行帐号 Account number。

现在就是说如何实现两张卡不能同时取钱,拿钱等等,也就是两个人不能同时对MYSQL里其帐号下的信息进行操作 (因为拿了钱以后,数据库里的数据会改动),

如果客户在用的时候,他的家人必须等到他完了以后才可以用。反之以然。

请问我应该在MySQL里面如何编程或者操作那,写谢谢了

gaga 发表于 2005-11-24 15:42

先翻一下 lock tables 和 unlock tables

xiaohuihui 发表于 2005-11-24 17:12

同意楼上的,你可以设置锁定,由两种方式可以考虑,也就是OPTIMISTIC和PESSIMISTIC 。

mauce 发表于 2005-11-25 10:13

谢谢两位,能说的具体一些吗,刚刚开始学MySQL,顾客去拿钱,他可以对其在数据库表格中的数据修改,比如拿了钱那么他的帐号里的钱就会减少,那如果同时Lock的话不是他也不能进行超做了,只是限制第2人同时对这个帐号操作而已,

可以不Lock整个Tabel吗,因为那个帐号只是Account表格中的一个衡列,表格中还有很多其他顾客的帐号Lock了Table不是别人也不能用了。

还有那个语句可以如何嵌入JAVA那,这么写啊,痛苦

xiaohuihui 发表于 2005-11-25 11:02

lock 只是对他这个账号,目的也就是防止别人在读取他的时候DATEN的错误(就是在他修改DATEN时--钱少了)。我不知道你用JAVA中的什么知识点来做?

gaga 发表于 2005-11-25 12:49

原帖由 mauce 于 2005-11-25 09:13 发表
谢谢两位,能说的具体一些吗,刚刚开始学MySQL,顾客去拿钱,他可以对其在数据库表格中的数据修改,比如拿了钱那么他的帐号里的钱就会减少,那如果同时Lock的话不是他也不能进行超做了,只是限制第2人同时对这个帐 ...


通常读操作是不需要考虑并发操作的影响的。需要保护的是写操作。而mysql里update是原子操作,不会导致两个线程同时更新数据。只是如果你的问题强调事务安全的话,可以显式的锁定表。

线程获得write锁的时候,只有该线程可以读写表,其他线程的操作请求被排队。

在java里操作数据库,又是一大段内容。可以翻一下JDBC API。至于如何‘嵌入’到java语句……Statement的executeQuery就可以了吧?或者Connection的PreparedStatement?



以上只是个人理解,或许有偏差。

tadios 发表于 2005-11-25 21:16

建一个表格online,里面储存当前使用机器的用户的id,当用户使用完了以后(注销),将这个id在该表格中删除.
每个id登录的时候,检查这个id是否在online中存在,如果存在则报错,拒绝登录

woo2333 发表于 2005-11-26 21:28

这个好象是database自己控制的吧,在SQL Server里 lock Table是default的。
不过在SQL Server里在修改时,整个表table会被lock掉,在oracle db里,会把现在这次更改前的那个快照展现给需要查询的用户。
所以在频繁修改的操作中SQL Server的性能是很弱的。

你的问题跟database没关系,因为transactions 在 database里是要求 ACID的,这些已经在database内部实现的

Marvin 发表于 2005-11-26 23:24

原帖由 tadios 于 2005-11-25 20:16 发表
建一个表格online,里面储存当前使用机器的用户的id,当用户使用完了以后(注销),将这个id在该表格中删除.
每个id登录的时候,检查这个id是否在online中存在,如果存在则报错,拒绝登录

同意!
我也觉得LZ的问题应该是数据库的设计问题。
可以建一个parent card的表和一个common card的表。
通过相同的account number 进行关联。
表中的每个纪录都有一个online的属性
一个表的记录更新前要查询一下另一个表中相应纪录的online状态。
应该就可以确保数据的一致性。

希望明天会更好 发表于 2005-11-27 03:47

楼主你的问题从根本上误导了楼下兄弟们的回答。你的要求明显是业务逻辑,你却希望放到数据层来实现,这合理吗。为什么要限制同时操作,如果怕相互影响的话,可以用事务来解决。

woo2333 发表于 2005-11-27 14:06

同意楼上所说的,lz自己搞错了对象。不过不太理解,什么情况下,可以两个人同时zugreifen一个konto。如果你不用datenbank, 而用其他的container(hashmap,List), 你要做的不是sperren掉你的konto,而是怎样去sychronisieren你的数据在Business logic。 如果用databank的话,根本不存在你说的那个情况,因为在datenbank里的Transaktion是serial atom Aktion, 只有lesen,lesen是可以同时进行的,所有这些是datenbank已经实现的。

gaga 发表于 2005-11-27 17:17

原帖由 woo2333 于 2005-11-27 13:06 发表
同意楼上所说的,lz自己搞错了对象。不过不太理解,什么情况下,可以两个人同时zugreifen一个konto。如果你不用datenbank, 而用其他的container(hashmap,List), 你要做的不是sperren掉你的konto,而是怎样去sych ...

也许是我一开始就误导了lz的问题。

不过还是有些疑问。即使使用数据库,仍然需要考虑一些数据同步的问题。
比如终端a需要改动某个账目的金额,过程应该是选择表,读取数据,计算(扣除金额),更新表。在读取和更新之间,如果终端b也执行了更新操作,就会出现问题。所以我觉得要么用事务要么锁定表。

学info的同学可以讨论一下具体应该是怎样做。$学习了$

woo2333 发表于 2005-11-27 21:11

原帖由 gaga 于 2005-11-27 16:17 发表


也许是我一开始就误导了lz的问题。

不过还是有些疑问。即使使用数据库,仍然需要考虑一些数据同步的问题。
比如终端a需要改动某个账目的金额,过程应该是选择表,读取数据,计算(扣除金额),更新表。在 ...

所有的这些统称为Transaktion,在datenbank里面这些事已经实现的。只有read,read是可以同时进行的,(read,write),(write,write)都是不能同时进行的,也就是说只有写完才可以读,写完可以在写。 每个Datenbank的lock机制都是不一样的,SQL Server是一定要等写完,才可以读,在oracle DB 里 是给user 之前的快照, 这个比SQL Server在性能上要好上很多。不过读过Microsoft的文章,把Oracle的做法贬称之为 Magic,指责这个是不可能实现的。

gaga 发表于 2005-11-27 23:09

原帖由 woo2333 于 2005-11-27 20:11 发表


所有的这些统称为Transaktion,在datenbank里面这些事已经实现的。只有read,read是可以同时进行的,(read,write),(write,write)都是不能同时进行的,也就是说只有写完才可以读,写完可以在写。 每个Date ...

那具体到MySQL又是如何实现的?(懒得去翻了,你就当复习一下吧,lz跟俺一起听课,hehe)

希望明天会更好 发表于 2005-11-28 01:13

楼主你还是没得要领,MySQL又是如何实现的你没必要去知道,你只要将每次帐户数据的操作放进一个事务(Transaktion)中,MySQL就会自动替你维护事务的独立性,使不同的事务(也就是不同的帐户操作)之间不相互影响。

既然你想知道我也可以告诉你MySQL和大多数数据库都是用(在不同粒度的)数据锁定来实现的(但oracle不是),不同的锁定级别决定了不同的事务并发性。锁定级别从低到高分别为READ UNCOMMITTED, READ COMMITTED, REPEATABLE READ, SERIALIZABLE。 级别越高并发越差,级别越低安全越差,采用什么级别的锁定,由项目的实际情况而定。一般来说 READ COMMITTED, REPEATABLE READ是较好的平衡点。如果按楼主一开始提出每次只允许一个用户操作,那等价与 SERIALIZABLE,这是最安全但并发最差的一种方案。如非万不得一,一般是避免的

gaga 发表于 2005-11-29 01:17

正好这阵子数据处理结果越来越多,维度太高无法再用文件系统去管理了,打算迁移到数据库里。顺便学一下数据库。然后再来讨论。btw,楼主呢?

不知道这里有没有玩postgresql的?实际存储效率如何?手册说可能会用到5倍的空间去存储数据,有点夸张。数据计算结果本身就数十G了,真怕硬盘撑不住。
页: [1]
查看完整版本: 问一个MySQL的问题,谢谢了