数据库有四种隔离级别,分别是:
SOLATION_READ_UNCOMMITTED:允许读取改变了的还未提交的数据,可能导致脏读、不可重复读和幻读。
ISOLATION_READ COMMITTED:允许并发事务提交之后读取,可以避免脏读,可能导致重复读和幻读。
ISOLATION_REPEATABLE_READ:对相同字段的多次读取结果一致,可导致幻读。
ISOLATION_SERIALIZABLE:完全服从ACID的原则,确保不发生脏读、不可重复读和幻读。
四种不同的隔离级别代表着数据库对资源锁的粒度。
脏读:说明数据库事务在修改一条记录的时候,没有增加排他锁,导致其他事务可以进行查询。
不可重复读:说明事务在修改数据库记录的时候对一行记录增加了排他锁,导致其他事务不能查询和更新,但一个事务完成前没有对查询的记录加排他锁,一个事务中若两次查询同一记录,两次查询之间,其他事务可能会更改当前记录,解决方法是一个事务没有完成前,锁定查询的记录,不允许其他事务修改。
幻读:与脏读类似,但锁定的资源粒度不同,脏读是同一事务两次查询同一记录,返回不同结果;而幻读是按条件查询一个范围的数据,如select * from users where id <=20, 第一次查询是20条记录,第二次查询19条记录,一个事务中两次查询之间,其他事务删除了一条记录,导致两次查询结果不同。幻读应该是需要锁表才能避免,即锁定一个事务查询过程中所有表,不能更新。
--以上是个人理解,若有错误,望指正。
原文地址:https://www.cnblogs.com/yangyijun/p/9096711.html
时间: 2024-11-13 08:13:27