美文网首页
serializable隔离级别和Repeatable read

serializable隔离级别和Repeatable read

作者: 无聊之园 | 来源:发表于2019-06-10 18:40 被阅读0次

mysql 的XA需要serializable隔离级别

serializable隔离级别和RR隔离级别有什么取别?
答:serializable隔离级别,select是会加读锁的,rr不会。

RR会产生幻读吗?
答:innodb不会。

脏读:事务读到了别人没有提交的数据。

不可重复读:针对的是update,事务读到了别人已经提交的修改的数据:第一次读别人没提交,第二次读别人提交了,两次读的结果不一样。

幻读:针对的是insert,一个事务读到了别人insert的数据,一次读还没有这条记录,第二次别人insert了,就读到了别人insert的记录。好像出现了幻觉一样。再比如:事务1,update where id < 3; 事务2:insert id = 2;结果事务1再select就查到了id=2的记录,他会很奇怪。

很多文章说,RR隔离级别会产生幻读,其实innodb的RR隔离级别,因为有MVCC和gap锁的存在,是不会产生幻读的,只会锁等待。

比如:
事务1:
start TRANSACTION;
insert into testinnodb values (14, 'hello');
commit;

事务2:
start TRANSACTION;
// 事务2是绝对读不到事务1insert的记录的,因为mvcc的缘故,事务1insert的记录的事务版本号高于事务2,所以事务2不会读到这条记录
select * from testinnodb;

再比如:
事务1:
start TRANSACTION;
select * from testinnodb;
// 再事务2执行了insert后执行
// 这条update语句,是不会执行成功的,因为insert记录会产生行锁,update只会等待锁释放。同理,update之后其他事务的insert也得不到执行,因为insert会产生间隙锁
update testinnodb set name = '1';

事务2:
start TRANSACTION;
insert into testinnodb values (14, 'hello');
commit;

所以说,innodb的rr模式,是不会产生幻读的。
并且:不同隔离级别的实现,依靠了各种锁实现。比如Read Uncommitted没有加锁,没有多版本控制。
Read Committed没有间隙锁,serializable的select加共享锁等待。

那么XA为什么要求数据库隔离级别是serializable呢?
因为,XA多个事务commit的总有先后顺序的,如果XA的A事务commit来了,其他事务读到这条记录,然后XA的B事务还没有commit,然后其他事务读到的XA的B事务的旧数据,就会存在数据脏读不一致的问题。而在serializable的读共享锁模式下,XA事务的B事务还update还没有提交,其他事务select只会等待,不会存在读到脏数据不一致的情况。

相关文章

网友评论

      本文标题:serializable隔离级别和Repeatable read

      本文链接:https://www.haomeiwen.com/subject/aostfctx.html