首页 新闻 会员 周边

数据库并发更新数据安全性问题

0
悬赏园豆:10 [已解决问题] 解决于 2018-08-31 17:37

    有一个问题就是,比如有一个字段是剩余金额,限制要加钱,但是又两个线程同时调用+100块钱,如果采用先读取余额,再把加好的钱set进去的,这肯定会出问题。第一个修改完了之后,第二个是在旧的值上加100,其实等于只加了100,而不是加200。这属于什么类型的问题。

    我能想到的解决方法就是,要不然就是在sql中写出amount=amount+xxx的方法去修改字段,或者要不然就是在这个业务方法上加锁。但是不知道这两种方法会不会有别的什么问题。

    不知道大家有没有什么好的,或者已经很成熟的现成的解决方案。

问题补充:

好像有点没说清楚,我说的那个场景,是已经在有可重复度隔离级别的情况下,然后出现,在修改之前,要读取数据,根据读取的数据修改数据导致的并发问题

时光之书的主页 时光之书 | 初学一级 | 园豆:12
提问于:2018-08-30 11:56
< >
分享
最佳答案
0

update qian+=100 where qian=50

收获园豆:5
吴瑞祥 | 高人七级 |园豆:29449 | 2018-08-30 12:12

比如说这个方法,可以确保第二个线程如果出现脏读的话,执行会失败。

Thread A:

Update Amount=Amount+100 where Amount=1000

 

Thread B:

Update Amount=Amount+100 where Amount=1000 (读到的A没更新前的数据)

 

这种情况下,B会更新失败,你得想办法处理这种失败。

爱编程的大叔 | 园豆:30839 (高人七级) | 2018-08-30 12:50

@爱编程的大叔: 嗯嗯,用的是CAS算法,貌似可以

时光之书 | 园豆:12 (初学一级) | 2018-08-30 13:54
其他回答(4)
0

这个问题很复杂,每个解决方案都有一些问题,就看你能接受哪些问题了。

建议自行查阅有关数据库锁冲突解决相关的文档。

这样你才知道某个解决方案有什么副作用,什么后遗症。

收获园豆:5
爱编程的大叔 | 园豆:30839 (高人七级) | 2018-08-30 12:04
0

在单机数据库下,可以先用select * from table for update; 比如mysql在可重复的的隔离级别下,自带的next-key lock是可以解决这种问题的。

让我发会呆 | 园豆:2929 (老鸟四级) | 2018-08-31 15:08
0

悲观锁aaa

猝不及防 | 园豆:2781 (老鸟四级) | 2018-08-31 16:56
0

锁机制, 悲观锁

春眠不觉笑 | 园豆:204 (菜鸟二级) | 2018-09-14 15:34
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册