高并发下丢失更新的解决方案

本文探讨了在高并发下出现的丢失更新问题,详细分析了第二类丢失更新现象,以及为何在可重复读隔离级别下仍会出现该问题。提出了四种解决方案,包括依赖数据库的事务隔离级别调整、特殊SQL、悲观锁和乐观锁策略,强调根据并发冲突频率选择合适的方法,并给出了实际应用案例。
摘要由CSDN通过智能技术生成

1 背景

**关键词:**并发、丢失更新

预收款账户表上有个累计抵扣金额的字段,该字段的含义是统计商家预收款账户上累计用于抵扣结算成功的金额数。更新时机是,账单结算完成时,更新累计抵扣金额=累计抵扣金额+账单金额。

2 问题及现象

发现当账单结算完成时,偶尔会发生累计抵扣金额字段值更新不准确的现象。比如,某商家账户上累计抵扣金额原本为0元,当发生两笔分别为10和8的账单结算完成后,理论上累计抵扣金额应该变为18元,但实际为10元。也就是说,第二次更新把前一次更新内容给覆盖掉了。

3 问题分析

该问题为典型的第二类丢失更新问题。

3.1 概念解释

事务在并发情况下,常见如下问题:

1.**脏读:**一个事务读取了已被另个一个事务修改但尚未提交的数据。当一个事务正在访问数据,并且对数据进行了修改,而这种修改还没有提交到数据库中;这时另外一个事务也访问这个数据,然后使用了这个未提交的数据。
2.**不可重复读:**在一个事务内,多次读同一数据,读到的结果不同。第一个事务还没有结束时,另外一个事务也访问该同一数据。那么,在第一个事务中的两次读数据之间,由于第二个事务的修改,那么第一个事务两次读到的数据可能是不一样的。这样就发生了在一个事务内两次读到的数据是不一样的,因此称为是不可重复读。
3.**幻读:**同一事务中,当同一个查询执行多次的时候,由于其他事务进行了插入操作并提交事务,导致每次返回不同的结果集。幻读是事务非独立执行时发生

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值