mysql 数据丢失更新的解决方法

最新看《innodb 引擎内幕》,作者有介绍丢失更新的问题,这里记录自己的想法和方案

-------------------------------------------------------------------

问题描述:

 mysql 数据库丢失更新的定义:(其实在数据库角度都不会产生丢失更新的问题,问题的源头应用程序逻辑更新的问题)

  1. 事务1 查询一行数据放在本地缓存,并且显示给用户user1        -->select balance from account where user= 'a' ;

  2. 事务2 查询同样的一行数据放在本地缓存,并且显示给用户user2    -->select balance from account where user= 'a' ;

  3. 用户user1修改这条数据,并且更新提交数据库     --> update account set balance = balance -100 where user= 'a' ;

  4. 用户user2修改显示的数据,并且更新提交数据库  --> update account set balance = balance -800 where user= 'a' ;

   显然上面user1 更新的数据丢失了,这也是更新覆盖,比如用户转账的操作。a 账户总共1000,事务1和事务2查询账户都是1000,然后事务1账户扣减100,提交。事务2扣减800提交。这时候账户余额为200,事务1扣减的100 会不翼而飞,这会导致严重的问题。

-------------------------------------------------------------------

暂时想到两种解决办法:

解决办法1:使用悲观锁

  1)读取锁定 --> select balance from account where user= 'a'  for update 

  2)更新 --> update account set balance = balance -100 where user= 'a'     

解决办法2: 使用乐观锁

  1)表增加字段 jpa_version int 版本号  -->  select balance,version from account where user= 'a'  

  2)  使用版本号更新 --> update account set balance = balance -100 where user= 'a' and jpa_version = ${version}             

总结:

  对于账户交易建议直接使用悲观,数据库的性能很高,并发度不是很高的场景两者性能没有太大差别。如果是交易减库存的操作可以考虑乐观锁,保证并发度。

 

转载于:https://www.cnblogs.com/immer/p/10930020.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值