数据库
首页 > 数据库> > 数据库并发写入问题-丢失更新与写入偏差

数据库并发写入问题-丢失更新与写入偏差

作者:互联网

MVCC

https://blog.csdn.net/qq_41775852/article/details/104853909
数据库中的MVCC多版本并发控制(快照隔离)可以避免事务并发时的脏读、不可重复读以及幻读的问题,但是却无法避免丢失更新以及写入偏差的问题。

丢失更新和写入偏差

丢失更新和写入偏差的原因是相同的:并发事务首先查询得到了相同的记录集,然后根据此记录集进行更新、插入、删除等动作。由于快照隔离,事务感受不到其他事务对记录集的更改,所以可以成功提交事务。但是并发事务的修改却出现了矛盾,导致数据库不一致。

解决方法

CAS

比较并设置(CAS, Compare And Set)是一种原子操作,此操作的目的是为了避免丢失更新:只有当前值从上次读取时一直未改变,才允许更新发生。如果当前值与先前读取的值不匹配,则更新不起作用,且必须重试读取-修改-写入序列。但是在提供快照隔离的事务中不起作用

显示锁定

由于并发事务的更改都是基于读取到的记录集,所以只要事务对读取到的记录集加排他锁,然后再对记录集更新,提交事务之后才释放排他锁。这样并发事务就只能读取到其他事务以及提交后的数据,则不会出现不一致的状态。

比如对于医生请假事务,读取并锁定所有医生的值班状态,修改自己的值班状态为请假,提交事务后释放锁。则第二个医生在请假事务中读取所有医生值班状态会阻塞,直到上一个事务提交,发现只剩自己一个人值班,则无法请假。

序列化隔离级别

使用事务的序列化隔离级别可以避免丢失更新和写入偏差。

标签:事务,读取,记录集,写入,更新,并发,数据库
来源: https://blog.csdn.net/qq_41775852/article/details/111916026