版权声明:本文为博主原创文章,未经博主同意不得转载。

https://blog.csdn.net/z50L2O08e2u4afToR9A/article/details/82186189

事务ACID特性,当中I代表隔离性(Isolation)。

 

什么是事务的隔离性?

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

 

一个事务怎么会干扰其它事务呢?

咱们举样例来说明。假设有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产生的影响。这个影响叫做“幻读”。

 

能够看到,并发的事务可能导致其它事务:

  • 读脏

  • 不可反复读

  • 幻读

 

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

依照SQL92标准。InnoDB实现了四种不同事务的隔离级别:

  • 读未提交(Read Uncommitted)

  • 读提交(Read Committed, RC)

  • 可反复读(Repeated Read, RR)

  • 串行化(Serializable)

 

不同事务的隔离级别,实际上是一致性与并发性的一个权衡与折衷。

 

InnoDB的四种事务的隔离级别。各自是怎么实现的?

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

 

一。读未提交(Read Uncommitted)

这样的事务隔离级别下。select语句不加锁。

画外音:官方的说法是

SELECT statements are performed in a nonlocking fashion.

 

此时。可能读取到不一致的数据,即“读脏”。

这是并发最高,一致性最差的隔离级别。

 

二。串行化(Serializable)

这样的事务的隔离级别下,全部select语句都会被隐式的转化为select ... in share mode.

 

这可能导致。假设有未提交的事务正在改动某些行,全部读取这些行的select都会被堵塞住。

画外音:官方的说法是

To force a plain SELECT to block if other transactions have modified the selected rows.

 

这是一致性最好的,但并发性最差的隔离级别。

 

在互联网大数据量,高并发量的场景下,差点儿不会使用上述两种隔离级别。

 

三,可反复读(Repeated Read, RR)

这是InnoDB默认的隔离级别,在RR下:

(1)普通的select使用快照读(snapshot read)。这是一种不加锁的一致性读(Consistent Nonlocking Read)。底层使用MVCC来实现,具体的原理在《InnoDB并发如此高,原因居然在这?》中有具体的描写叙述;

 

(2)加锁的select(select ... in share mode / select ... for update), update, delete等语句。它们的锁,依赖于它们是否在唯一索引(unique index)上使用了唯一的查询条件(unique search
condition),或者范围查询条件(range-type search condition):

  • 在唯一索引上使用唯一的查询条件。会使用记录锁(record lock),而不会封锁记录之间的间隔,即不会使用间隙锁(gap lock)与临键锁(next-key lock)

  • 范围查询条件。会使用间隙锁与临键锁。锁住索引记录之间的范围,避免范围间插入记录。以避免产生幻影行记录,以及避免不可反复的读

画外音:这一段有点绕,多读几遍。

关于记录锁,间隙锁,临键锁的很多其它说明。详见《

__biz=MjM5ODYxMDA5OQ==&mid=2651961471&idx=1&sn=da257b4f77ac464d5119b915b409ba9c&chksm=bd2d0da38a5a84b5fc1417667fe123f2fbd2d7610b89ace8e97e3b9f28b794ad147c1290ceea&scene=21#wechat_redirect" rel="nofollow">InnoDB。select为啥会堵塞insert?》。

 

四,读提交(Read Committed, RC)

这是互联网最经常使用的隔离级别,在RC下:

(1)普通读是快照读;

(2)加锁的select, update, delete等语句。除了在外键约束检查(foreign-key constraint checking)以及反复键检查(duplicate-key checking)时会封锁区间,其它时刻都仅仅使用记录锁;

此时,其它事务的插入依旧能够运行,就可能导致。读取到幻影记录。


总结

  • 并发事务之间相互干扰。可能导致事务出现读脏,不可反复度,幻读等问题

  • 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

也许有朋友问,为啥没提到insert?能够查阅《InnoDB并发插入,居然使用意向锁?》。

 

https://mmbiz.qpic.cn/mmbiz_jpg/Ir1gRyhAx7udO2WibD2tcDg4rqPvjo7jhbqZ6SFJZIxBo6N8ZZDptOCp8rYrRlXh8LiaAatFLtJdaWukz7qMvbDQ/640?

wx_fmt=jpeg" alt="640?wx_fmt=jpeg" />

架构师之路-分享可落地的架构文章

本文新名词颇多。前置文章更精彩:

InnoDB,MVCC。快照读

InnoDB,记录锁,间隙锁,临键锁

InnoDB,B+树的细节

InnoDB与MyISAM索引的差异

4种事务的隔离级别,InnoDB怎样巧妙实现?的更多相关文章

  1. 几种事务的隔离级别,InnoDB如何实现?

    事务ACID特性,其中I代表隔离性(Isolation). 什么是事务的隔离性? 隔离性是指,多个用户的并发事务访问同一个数据库时,一个用户的事务不应该被其他用户的事务干扰,多个并发事务之间要相互隔离 ...

  2. 数据库事务的四大特性以及4种事务的隔离级别-以及对应的5种JDBC事务隔离级别

    本篇讲诉数据库中事务的四大特性(ACID),并且将会详细地说明事务的隔离级别. 如果一个数据库声称支持事务的操作,那么该数据库必须要具备以下四个特性: ⑴ 原子性(Atomicity) 原子性是指事务 ...

  3. Java 事务的隔离级别

    引言 之前关于事务的文章已介绍了事务的概念以及事务的四个属性(ACID),相信你对事务应该有所认识和了解. 本篇文章是关于事务的隔离性,介绍数据库提供的多种隔离级别. 数据库访问的并发性问题 所谓事务 ...

  4. Mysql InnoDB引擎下 事务的隔离级别

    mysql InnoDB 引擎下事物学习 建表user CREATE TABLE `user` ( `uid` bigint(20) unsigned NOT NULL AUTO_INCREMENT, ...

  5. 【Mysql】事务的四种特性和隔离级别

    四种特性: 原子性(Atomicity):事务里所有操作视为一个整理,要么全部完成,要么全回滚. 一致性(Consistency):操作前后,数据库内数据逻辑上一致.比如:1w元转账给不同的人,转出去 ...

  6. Spring中事务的传播行为,7种事务的传播行为,数据库事务的隔离级别

    Propagation.REQUIRED 代表当前方法支持当前的事务,且与调用者处于同一事务上下文中,回滚统一回滚(如果当前方法是被其他方法调用的时候,且调用者本身即有事务),如果没有事务,则自己新建 ...

  7. MySQL事务学习-->隔离级别

    MySQL事务学习-->隔离级别 6 事务的隔离级别 设置的目的 在数据库操作中,为了有效保证并发读取数据的正确性,提出的事务隔离级别. 数据库是要被广大客户所共享访问的,那么在数据库操作过程中 ...

  8. MySQL数据库事务各隔离级别加锁情况--read committed && MVCC(转载)

    http://www.imooc.com/article/17290 http://www.51testing.com/html/38/n-3720638.html https://dev.mysql ...

  9. 事务特性,事务的隔离级别,并发事务可能出现的问题,spring事务 数据库锁

    1.0 事务特性(ACID) Atomicity:原子性,一个事务不可以被拆分 Consistency:一致性,在事务执行前数据库的数据处于正确的状态,而事务执行完成后数据库的数据还是处于正确的状态, ...

随机推荐

  1. Web开发.net framework 类库中必须掌握的命名空间(或者类)【转】

    Web开发常用命名空间和类. System.Collections //命名空间包含接口和类,这些接口和类定义各种对象(如列表.队列.位数组.哈希表和字典)的集合.System.Collections ...

  2. jsp+servlet实现文件的上传和下载

    实现文件的上传和下载首先需要理解几个知识,这样才可以很好的完成文件的上传和下载: (1):上传文件是上传到服务器上,而保存到数据库是文件名 (2):上传文件是以文件转换为二进制流的形式上传的 (3): ...

  3. 线程池 多线程运行结束后 如何关闭? ExecutorService的正确关闭方法

    前言 最近在使用ExecutorService的时候,对于与ExecutorService相关的概念有些迷糊, 加上本身ExecutorService内部的有些方法名在取名上也容易让使用者误解,导致 ...

  4. Zookeeper笔记(三)部署与启动Zookeeper

    下载zookeeper安装包 去Zookeeper官网,下载地址http://zookeeper.apache.org/releases.html,建议下载稳定版本,我下载的是zookeeper-3. ...

  5. ahoi2009维护序列

    链接:https://www.luogu.org/problemnew/show/P2023 裸的线段树维护+* 代码: #include <bits/stdc++.h> using na ...

  6. STM32的HAL库中的DMA_FLAG_TCIF3_7等几个宏定义的含义

    DMA_FLAG_TCIF0_4就是指DMA的通道0和通道4,DMA_FLAG_TCIF1_5就是指DMA的通道1和通道5,DMA_FLAG_TCIF2_6就是指DMA的通道2和通道6,DMA_FLA ...

  7. Python yaml处理

    安装方式: pip install pyyaml 一.module.yaml为 name: Tom Smith age: 37 spouse: name: Jane Smith age: 25 chi ...

  8. 胜利大逃亡 HDU1429 (bfs)

    最后两题算是这个专题最难的两题了 这题关键是标记数组 我一开始设置的是 四维的  第三维是朝向  第四维是钥匙个数 但是 不同的取法钥匙个数可能会重复   如:取ab钥匙和取ac钥匙都是两枚  导致w ...

  9. 016 在大数据中,SSH无密钥登录

    一:概述 1.关于ssh ssh是一种安全协议. 会生成一对公钥和私钥. 2.问题的由来 3.解决方式 将生成的公钥发送到远程的机器上. 4.位置 主目录下的.ssh文件下. 二:在伪分布式下的操作 ...

  10. poj 1797 最大最小路段【dijkstra】 (经典)

    <题目链接> 题目大意: Hugo Heavy要从城市1到城市N运送货物,有M条道路,每条道路都有它的最大载重量,问从城市1到城市N运送最多的重量是多少. 解题分析: 感觉这道题用dijk ...