找回密码
 注册

微信登录

微信扫一扫,快速登录

萍聚头条

查看: 1062|回复: 15

问一个MySQL的问题,谢谢了

[复制链接]
发表于 2005-11-24 15:34 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?注册 微信登录

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

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

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

请问我应该在MySQL里面如何编程或者操作那,写谢谢了
Die von den Nutzern eingestellten Information und Meinungen sind nicht eigene Informationen und Meinungen der DOLC GmbH.
发表于 2005-11-24 15:42 | 显示全部楼层
Die von den Nutzern eingestellten Information und Meinungen sind nicht eigene Informationen und Meinungen der DOLC GmbH.
回复 支持 反对

使用道具 举报

发表于 2005-11-24 17:12 | 显示全部楼层
同意楼上的,你可以设置锁定,由两种方式可以考虑,也就是OPTIMISTIC和PESSIMISTIC 。
Die von den Nutzern eingestellten Information und Meinungen sind nicht eigene Informationen und Meinungen der DOLC GmbH.
回复 支持 反对

使用道具 举报

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

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

还有那个语句可以如何嵌入JAVA那,这么写啊,痛苦
Die von den Nutzern eingestellten Information und Meinungen sind nicht eigene Informationen und Meinungen der DOLC GmbH.
回复 支持 反对

使用道具 举报

发表于 2005-11-25 11:02 | 显示全部楼层
lock 只是对他这个账号,目的也就是防止别人在读取他的时候DATEN的错误(就是在他修改DATEN时--钱少了)。我不知道你用JAVA中的什么知识点来做?
Die von den Nutzern eingestellten Information und Meinungen sind nicht eigene Informationen und Meinungen der DOLC GmbH.
回复 支持 反对

使用道具 举报

发表于 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?



以上只是个人理解,或许有偏差。
Die von den Nutzern eingestellten Information und Meinungen sind nicht eigene Informationen und Meinungen der DOLC GmbH.
回复 支持 反对

使用道具 举报

发表于 2005-11-25 21:16 | 显示全部楼层
建一个表格online,里面储存当前使用机器的用户的id,当用户使用完了以后(注销),将这个id在该表格中删除.
每个id登录的时候,检查这个id是否在online中存在,如果存在则报错,拒绝登录
Die von den Nutzern eingestellten Information und Meinungen sind nicht eigene Informationen und Meinungen der DOLC GmbH.
回复 支持 反对

使用道具 举报

发表于 2005-11-26 21:28 | 显示全部楼层
这个好象是database自己控制的吧,在SQL Server里 lock Table是default的。
不过在SQL Server里在修改时,整个表table会被lock掉,在oracle db里,会把现在这次更改前的那个快照展现给需要查询的用户。
所以在频繁修改的操作中SQL Server的性能是很弱的。

你的问题跟database没关系,因为transactions 在 database里是要求 ACID的,这些已经在database内部实现的
Die von den Nutzern eingestellten Information und Meinungen sind nicht eigene Informationen und Meinungen der DOLC GmbH.
回复 支持 反对

使用道具 举报

发表于 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状态。
应该就可以确保数据的一致性。
Die von den Nutzern eingestellten Information und Meinungen sind nicht eigene Informationen und Meinungen der DOLC GmbH.
回复 支持 反对

使用道具 举报

发表于 2005-11-27 03:47 | 显示全部楼层
楼主你的问题从根本上误导了楼下兄弟们的回答。你的要求明显是业务逻辑,你却希望放到数据层来实现,这合理吗。为什么要限制同时操作,如果怕相互影响的话,可以用事务来解决。
Die von den Nutzern eingestellten Information und Meinungen sind nicht eigene Informationen und Meinungen der DOLC GmbH.
回复 支持 反对

使用道具 举报

发表于 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已经实现的。
Die von den Nutzern eingestellten Information und Meinungen sind nicht eigene Informationen und Meinungen der DOLC GmbH.
回复 支持 反对

使用道具 举报

发表于 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的同学可以讨论一下具体应该是怎样做。$学习了$
Die von den Nutzern eingestellten Information und Meinungen sind nicht eigene Informationen und Meinungen der DOLC GmbH.
回复 支持 反对

使用道具 举报

发表于 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,指责这个是不可能实现的。
Die von den Nutzern eingestellten Information und Meinungen sind nicht eigene Informationen und Meinungen der DOLC GmbH.
回复 支持 反对

使用道具 举报

发表于 2005-11-27 23:09 | 显示全部楼层
原帖由 woo2333 于 2005-11-27 20:11 发表


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


那具体到MySQL又是如何实现的?(懒得去翻了,你就当复习一下吧,lz跟俺一起听课,hehe)
Die von den Nutzern eingestellten Information und Meinungen sind nicht eigene Informationen und Meinungen der DOLC GmbH.
回复 支持 反对

使用道具 举报

发表于 2005-11-28 01:13 | 显示全部楼层
楼主你还是没得要领,MySQL又是如何实现的你没必要去知道,你只要将每次帐户数据的操作放进一个事务(Transaktion)中,MySQL就会自动替你维护事务的独立性,使不同的事务(也就是不同的帐户操作)之间不相互影响。

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

使用道具 举报

发表于 2005-11-29 01:17 | 显示全部楼层
正好这阵子数据处理结果越来越多,维度太高无法再用文件系统去管理了,打算迁移到数据库里。顺便学一下数据库。然后再来讨论。btw,楼主呢?

不知道这里有没有玩postgresql的?实际存储效率如何?手册说可能会用到5倍的空间去存储数据,有点夸张。数据计算结果本身就数十G了,真怕硬盘撑不住。
Die von den Nutzern eingestellten Information und Meinungen sind nicht eigene Informationen und Meinungen der DOLC GmbH.
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册 微信登录

本版积分规则

我是开心果

Archiver|手机版|AGB|Impressum|Datenschutzerklärung|萍聚社区-德国热线-德国实用信息网

GMT+2, 2025-6-18 06:33 , Processed in 0.088826 second(s), 28 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表