有一个问题就是,比如有一个字段是剩余金额,限制要加钱,但是又两个线程同时调用+100块钱,如果采用先读取余额,再把加好的钱set进去的,这肯定会出问题。第一个修改完了之后,第二个是在旧的值上加100,其实等于只加了100,而不是加200。这属于什么类型的问题。
我能想到的解决方法就是,要不然就是在sql中写出amount=amount+xxx的方法去修改字段,或者要不然就是在这个业务方法上加锁。但是不知道这两种方法会不会有别的什么问题。
不知道大家有没有什么好的,或者已经很成熟的现成的解决方案。
update qian+=100 where qian=50
比如说这个方法,可以确保第二个线程如果出现脏读的话,执行会失败。
Thread A:
Update Amount=Amount+100 where Amount=1000
Thread B:
Update Amount=Amount+100 where Amount=1000 (读到的A没更新前的数据)
这种情况下,B会更新失败,你得想办法处理这种失败。
@爱编程的大叔: 嗯嗯,用的是CAS算法,貌似可以
这个问题很复杂,每个解决方案都有一些问题,就看你能接受哪些问题了。
建议自行查阅有关数据库锁冲突解决相关的文档。
这样你才知道某个解决方案有什么副作用,什么后遗症。
在单机数据库下,可以先用select * from table for update; 比如mysql在可重复的的隔离级别下,自带的next-key lock是可以解决这种问题的。
悲观锁aaa
锁机制, 悲观锁