比如用户转账的操作。a 账户总共100,事务1和事务2查询账户都是100,然后事务1账户加50,提交,结果是50。事务2加50提交。这时候账户余额也为150,这会导致严重的问题。
解决办法1:使用悲观锁
1)读取锁定 --> select balance from account where user= ‘a’ for update
2)更新 --> update account set balance = balance -100 where user= ‘a’
我不认同这种方法会解决更新丢失的问题
首先说明一点:for update 的确会阻止共享锁和排他锁,但是并不会阻止select,比如 select * from user,这种没有加任何锁的select,因为执行select 默认是不加任何锁的,所以会出现下面的流程:
事务A 执行select balance from account where user= ‘a’ for update
事务B执行select balance from account where user= ‘a’ ,事务A执行 update操作,提交事务,结果150,事务B执行update操作,结果也是150。所以,我的答案是悲观所并不会阻止更新丢失。即使是加了隔离级别的任意一种也不会阻止,唯一的解决办法是,每执行一条sql,就提交一次事务才能解决。
希望各位能说出自己的意见,我会一 一查看