当前位置:   article > 正文

事务四种隔离级别如何加锁_在事务隔离级别为读已提交的情况下,写数据会加锁吗?

在事务隔离级别为读已提交的情况下,写数据会加锁吗?

数据库中事务的四种隔离级别(从低到高):READ-UNCOMMITTED(读取未提交)、READ-COMMITTED(读取已提交)、REPEATABLE-READ(可重复读)、SERIALIZABLE(可串行化)。

隔离级别脏读不可重复读幻读
READ-UNCOMMITTED
READ-COMMITTED×
REPEATABLE-READ××
SERIALIZABLE×××
  • READ-UNCOMMITTED(读取未提交): 最低的隔离级别,允许读取尚未提交的数据变更,可能会导致脏读、幻读或不可重复读。读取未提交级别只要在读操作时不加锁就行了。假设事务B首先对数据d进行修改为d1,A读取到了数据d=d1,接着事务B回退了,这样就导致了脏读,事务A读取了未提交的数据d1。只要数据库在读操作时不加读锁,就可能会出现这种情况。
  • READ-COMMITTED(读取已提交): 允许读取并发事务已经提交的数据,可以阻止脏读,但是幻读或不可重复读仍有可能发生。读取已提交级别,要在写操作上加写锁,读操作上按语句加读锁(就是每执行一行语句就释放一次读锁,下一行语句执行前再加一个读锁)。还针对刚才那种脏读情形,由于加了读锁和写锁,针对同一行数据加锁会互斥,所以在事务B提交之后或者回退之后,事务A才能进行读操作,就避免了脏读的情况发生。但是我们的读锁在每一次读语句执行完毕后会释放读锁,假如事务A中要先后读取两次数据d,先读取一次d,这时事务B进行了一次写操作,将d改为d1,那么第二次读取数据d时,d=d1与第一次读结果不一样,这就造成了不可重复度
  • REPEATABLE-READ(可重复读): 对同一字段的多次读取结果都是一致的,除非数据是被本身事务自己所修改,可以阻止脏读和不可重复读,但幻读仍有可能发生。可重复读级别是在写操作上加写锁,读操作上按事务加读锁(只有在事务提交后才会释放读锁)。这样就避免了两次读操作读取的结果不一致的问题了,因为两次读操作之间不可能会有对d进行的写操作出现。但是对于幻读是可能发生的,假如事务A中要查询该表中与条件匹配的若干行,事务B又写入了若干行新数据,之后事务A又再次进行了查询(由于innodb默认使用的是行锁,所以事务B的写锁与事务A的读锁不相斥,所以事务B有可以在事务A的两次查询中间执行)。这种情况下,事务A的两次查询得到的行结果/行数不同,这就是幻读
  • SERIALIZABLE(可串行化): 最高的隔离级别,完全服从ACID的隔离级别。所有的事务依次逐个执行,这样事务之间就完全不可能产生干扰,也就是说,该级别可以防止脏读、不可重复读以及幻读。可串行化级别下,事务的执行完全按照顺序来进行,像上面幻读的情况,事务A执行完了事务B才可以执行,这样就可以避免幻读情况的发生。可串行化级别下的读锁和写锁完全隔离,这么做可以有效的避免幻读、不可重复读、脏读等问题,但会极大的降低数据库的并发能力。
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/不正经/article/detail/239627
推荐阅读
相关标签
  

闽ICP备14008679号