我是靠谱客的博主 平常大白,最近开发中收集的这篇文章主要介绍mysql旧数据丢失_mysql 数据丢失更新的解决方法,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

问题描述:

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 会不翼而飞,实际上应该剩下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}

解决办法3:

1) 验证未修改前的金额是否一致--> update account set balance = 100 where user= 'a' and balance = $old_balance

总结:

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

最后

以上就是平常大白为你收集整理的mysql旧数据丢失_mysql 数据丢失更新的解决方法的全部内容,希望文章能够帮你解决mysql旧数据丢失_mysql 数据丢失更新的解决方法所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(65)

评论列表共有 0 条评论

立即
投稿
返回
顶部