新闻资讯

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

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

    问题描述:

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

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

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

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

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

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

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

    暂时想到两种解决办法:

    解决办法1:使用悲观锁

    1)读取锁定 --> from where user= 'a' for

    2)更新 --> = -100 = 'a'

    解决办法2: 使用乐观锁

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

    2) 使用版本号更新 --> = -100 = 'a' and = ${}

    总结:

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

网站首页   |    关于我们   |    公司新闻   |    产品方案   |    用户案例   |    售后服务   |    合作伙伴   |    人才招聘   |   

地址:北京市海淀区    电话:010-     邮箱:@126.com

备案号:冀ICP备2024067069号-3 北京科技有限公司版权所有