关于数据库事务中脏读、不可重复读和幻读的理解

数据库有四种隔离级别,分别是:

SOLATION_READ_UNCOMMITTED:允许读取改变了的还未提交的数据,可能导致脏读、不可重复读和幻读。 
ISOLATION_READ COMMITTED:允许并发事务提交之后读取,可以避免脏读,可能导致重复读和幻读。 
ISOLATION_REPEATABLE_READ:对相同字段的多次读取结果一致,可导致幻读。 
ISOLATION_SERIALIZABLE:完全服从ACID的原则,确保不发生脏读、不可重复读和幻读。 

四种不同的隔离级别代表着数据库对资源锁的粒度。

脏读:说明数据库事务在修改一条记录的时候,没有增加排他锁,导致其他事务可以进行查询。

不可重复读:说明事务在修改数据库记录的时候对一行记录增加了排他锁,导致其他事务不能查询和更新,但一个事务完成前没有对查询的记录加排他锁,一个事务中若两次查询同一记录,两次查询之间,其他事务可能会更改当前记录,解决方法是一个事务没有完成前,锁定查询的记录,不允许其他事务修改。

幻读:与脏读类似,但锁定的资源粒度不同,脏读是同一事务两次查询同一记录,返回不同结果;而幻读是按条件查询一个范围的数据,如select * from users where id   <=20, 第一次查询是20条记录,第二次查询19条记录,一个事务中两次查询之间,其他事务删除了一条记录,导致两次查询结果不同。幻读应该是需要锁表才能避免,即锁定一个事务查询过程中所有表,不能更新。

--以上是个人理解,若有错误,望指正。

猜你喜欢

转载自www.cnblogs.com/yangyijun/p/9096711.html