更新丢失问题的产生
事务A | 事务B |
---|---|
开启事务 | 开启事务 |
查询账户余额为 1000 | |
查询账户余额为1000 | |
汇入 100 ,修改余额为 1100 | |
提交事务,此时余额为 1100 | |
取走 100 ,修改余额为 900 | |
提交事务,此时余额为 900 |
悲观锁方式解决更新丢失问题
事务A | 事务B |
---|---|
开启事务 | 开启事务 |
使用排它锁查询账户余额为 1000 | |
使用排它锁查询账户余额进入等待 | |
汇入 100 ,修改余额为 1100 | |
提交事务,此时余额为 1100 | |
事务 A 提交后查询语句结束等待,查询出余额为 1100 | |
取走 100 ,修改余额为 1000 | |
提交事务,此时余额为 1000 |
乐观锁方式解决更新丢失问题:需要在余额表上新加一个 version 字段
事务A | 事务B |
---|---|
开启事务 | 开启事务 |
查询账户余额 , version 为 1000 , 1 | |
查询账户余额 , version 为 1000 , 1 | |
汇入 100 ,update 账户余额->1100 , version->2 where version = 1 | |
提交事务,此时余额 , version 为 1100 , 2 | |
取走 100 ,update 账户余额->900 , version->2 where version = 1 ,此时发现更新了 0 条记录 | |
说明此纪录当前版本号有问题,重新查询账户余额 , version 为 1100 , 2 。 | |
取走 100 ,update 账户余额->1000 , version->3 where version = 2 | |
提交事务,此时余额为 1000 |