美文网首页
4种事务的隔离级别,InnoDB如何实现?(转)

4种事务的隔离级别,InnoDB如何实现?(转)

作者: 阿猫阿狗Hakuna | 来源:发表于2018-08-31 13:58 被阅读77次
什么是事务的隔离性?

隔离性是指,多个用户的并发事务访问同一个数据库时,一个用户的事务不应该被其他的事务干扰,多个并发事务之间要相互隔离。

一个事务怎么干扰其他事务?

咱们举例子来说明,假设有InnoDB表:
t(id PK, name);

表中有三条记录:
1, shenjian
2, zhangsan
3, lisi

case 1

事务A,先执行,处于未提交的状态:
insert into t values(4, wangwu);

事务B,后执行,也未提交:
select * from t;

如果事务B能够读取到(4, wangwu)这条记录,事务A就对事务B产生了影响,这个影响叫做“读脏”,读到了未提交事务操作的记录。

case 2

事务A,先执行:
select * from t where id=1;

结果集为:
1, shenjian

事务B,后执行,并且提交:
update t set name=xxoo where id=1;
commit;

事务A,再次执行相同的查询:
select * from t where id=1;

结果集为:
1, xxoo

这次是已提交事务B对事务A产生的影响,这个影响叫做“不可重复读”,一个事务内相同的查询,得到了不同的结果。

case 3

事务A,先执行:
select * from t where id>3;

结果集为:
NULL

事务B,后执行,并且提交:
insert into t values(4, wangwu);
commit;

事务A,首次查询了id>3的结果为NULL,于是想插入一条为4的记录:
insert into t values(4, xxoo);

结果集为:
Error : duplicate key!

事务A的内心OS是:你TM在逗我,查了id>3为空集,insert id=4告诉我PK冲突?

这次是已提交事务B对事务A产生的影响,这个影响叫做“幻读”。

可以看到,并发的事务可能导致其他事务:

(1)脏读
(2)不可重复读
(3)幻读

InnoDB实现了哪几种事务的隔离级别?

(1)读未提交(read uncommitted)
(2)读已提交(read committed,RC)
(3)可重复读(repeated Read,RR)
(4)串行化(Serializable)

不同事务的隔离级别,实际上是一致性和并发性的权衡与折中
InnoDB四种事务的隔离级别,分别是怎么实现的?

InnoDB使用不同的锁策略来实现不同的隔离级别。

1.读未提交

select语句不加锁
此时,可能读到不一致的数据,即“脏读”。这是并发最高,一致性最差的级别。

2.串行化

这种事务隔离级别下,所有select语句会被隐式的转化为select...in share mode.
这会导致,如果有未提交的事务正在修改某些行,所有读取这些行的操作都会被阻塞。
这是一致性最好,并发性最差的隔离级别。

以上两种隔离级别基本不会使用
3.可重复读

InnoDB的默认隔离级别
(1)普通的select使用快照读,这是一种不加锁的一致性读,底层使用MVCC实现。
(2)加锁的select(select...in share mode/select...for update),update,delete等语句,它们的锁,依赖于它们是否在唯一索引上使用了唯一的查询条件,或者范围查询条件:

---在唯一索引上使用唯一的查询条件,会使用记录锁,而不会封锁记录之间的间隔,即不会使用间隙锁与临键锁。
---范围查询条件,会使用间隙锁与临键锁,锁住索引记录之间的范围,避免范围间插入记录,以避免产生幻影行记录,以及避免不可重复读。

4.读提交

(1)普通读是快照读
(2)加锁的select,update,delete等语句,除了在外键约束检查以及重复键检查时会封锁区间,其他时刻都只使用记录锁;
此时,其他事务的插入依然可以执行,就可能导致,读取到幻影记录。

总结

---并发事务之间相互干扰,可能导致事务出现读脏,不可重复度,幻读等问题
---InnoDB实现了SQL92标准中的四种隔离级别
(1)读未提交:select不加锁,可能出现读脏;
(2)读提交(RC):普通select快照读,锁select /update /delete 会使用记录锁,可能出现不可重复读;
(3)可重复读(RR):普通select快照读,锁select /update /delete 根据查询条件情况,会选择记录锁,或者间隙锁/临键锁,以防止读取到幻影记录;
(4)串行化:select隐式转化为select ... in share mode,会被update与delete互斥;
InnoDB默认的隔离级别是RR,用得最多的隔离级别是RC

相关文章

  • mysql事务隔离级别的实现原理

    mysql事务隔离级别的实现原理 mysql innodb中的四种事务隔离级别[https://www.jians...

  • mysql的事务隔离级别

    mysql中一共有4种隔离级别(因为只有InnoDB引擎支持事务,所以也可以说是InnoDB的事务隔离级别) 隔离...

  • innodb实现事务隔离的原理

    innodb默认的事务隔离级别为可重复读,在此隔离级别下,当开启一个事务时,innodb就会为这个事务创建一个视图...

  • Mysql笔记

    Mysql索引实现原理MysqlACID具体,隔离级别,隔离级别如何实现 1. 事务 1.1 事务的简介 在 My...

  • 4种事务的隔离级别,InnoDB如何实现?(转)

    什么是事务的隔离性? 隔离性是指,多个用户的并发事务访问同一个数据库时,一个用户的事务不应该被其他的事务干扰,多个...

  • 事务隔离级别:可重复读

    如果事务隔离级别显示REPEATABLE-READ,即是可重复读。 事务的四种隔离级别 (引自: Innodb中的...

  • InnoDB事务隔离级别实现原理

    数据库一般都会并发执行多个事务,多个事务可能会并发的对相同的一批数据进行增删改查操作,可能就会导致我们说的脏写、脏...

  • Innodb事务--隔离级别

    innodb 事务有四个隔离级别,分别为:未提交读、提交读、重复读与序列化 由于隔离级别的不同,会导致如下问题:脏...

  • MySQL相关(一)——— 事务和锁

    事务的隔离级别和锁机制 【1】InnoDB 事务隔离级别和锁 【2】脏读、不可重复读、幻读 mysql 相关 常用...

  • 【转】Innodb中的事务隔离级别和锁的关系

    申明: 本文转自Innodb中的事务隔离级别和锁的关系,解决了我关于锁、事务隔离的一些误解和疑问。在高并发系统中,...

网友评论

      本文标题:4种事务的隔离级别,InnoDB如何实现?(转)

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