• ISO和ANIS SQL标准指定了4种事务隔离级别的标准,但是很少有数据库厂商循环这些标准。例如Oracle数据库就不支持READ UNCOMMITTED和REPEATABLE READ
  • SQL标准定义的四个隔离级别为:
    • READ UNCOMMITTED
    • READ COMMITTED
    • REPEATABLE READ
    • SERIALIZABLE

一、总体概述

  • READ UNCOMMITTED称为浏览访问,仅仅针对事务而言的。READ COMMITTED称为游标问题。REPEATABLE READ的隔离,没有幻读的保护。SERIALIZABLE称为隔离,或的隔离

默认隔离级别

  • SQL和SQL2标准的默认事务隔离级别是SERIALIZABLE
  • InnoDB的默认隔离级别是REPEATABLE READ,但是与标准SQL不同的是,InnoDB存储引擎在REPEATABLE READ隔离级别下,使用Next-Key Lock锁的算法,因此避免幻读的产生。这与其他数据库系统(例如SQL Server)不同
  • Next-Key Lock锁的算法参阅:https://blog.csdn.net/qq_41453285/article/details/104314911
  • 所以说,InnoDB在默认的REPEATABLE READ隔离级别下已经能完全保证事务的隔离性要求,即达到SQL标准的SERIALIZABLE隔离级别
  • 隔离级别越低,事务请求的锁越少或保持锁的时间就越短。这也是为什么大多数数据库默认的事务隔离级别是READ COMMITTED

隔离级别与性能

  • 据了解。大部分的用户质疑SERIALIZABLE隔离级别带来的性能问题,但是根据Jim Gray在《Transaction Processing》一书中指出,两者的开销是一样的,甚至SERIALIZABLE可能更优!!!因此在InnoBD中选择REPEATABLE READ的事务隔离级别并不会有任何性能的损失
  • 同样的,即使使用READ COMMITTED的隔离级别,用户也不会得到性能的大幅度提升

二、事务隔离级别语法格式

  • 使用下面的命令来设置当前会话或全局的事务隔离级别:

  • 设置事务的默认隔离级别,可以在MySQL的配置文件中添加如下的内容

  • 查看当前会话的事务隔离级别,可以使用
select @@tx_isolation\G
  • 查看全局的事务隔离级别,可以使用
select @@global.tx_isolation\G

三、SERIALIZABLE

  • 在SERIALIZABLE隔离级别下,InnoDB会对每个SELECT语句后自动加上LOCK IN SHARE MODE,即为每个读取操作加一个共享锁
  • 因此在这个事务隔离级别下,读占用了锁,对一致性的非锁定读不再支持
  • 一致性的非锁定读参阅:https://blog.csdn.net/qq_41453285/article/details/104311461
  • 这是,事务隔离级别SERIALIZABLE符合数据库理论上的要求,即事务是well-formed的,并且是two-phrased的
  • 因为InnoDB在REPEATABLE READ隔离级别下就可以达到的隔离,因此一般不在本地事务中使用SERIALIZABLE隔离级别。SERIALIZABLE的事务隔离级别主要用于InnoDB存储引擎的分布式事务

四、READ COMMITTED

  • 在READ COMMITTED的事务隔离级别下,除了唯一性的约束检查以及外键约束的检查需要gap lock,InnoDB不会使用gap lock的所算法
  • gap lock算法参阅:https://blog.csdn.net/qq_41453285/article/details/104314911

使用这个事务隔离级别的注意事项

  • 首先,在MySQL 5.1中,READ COMMITTED事务隔离级别默认只能工作在replication(复制)二进制日志为ROW的格式下。如果二进制日志工作在默认的STATEMENT下,则会出现下面的错误:

主从数据不一致

  • 在MySQL 5.0版本之前,不支持ROW格式的二进制日志时,也许有人知道通过将参数innodb_locks_unsafe_for_binlog设置为1可以在二进制日志为STATEMENT下使用READ COMMITTED的事务隔离级别:

  • 接着在master上开启一个会话A执行如下事务,并且不需要提交

  • 在master上开启另一个会话B,执行下面的事务并且提交:

  • 接着会话A提交,并且查看表a的数据:

  • 但是在slave上看到的结果是:

  • 可以看到,数据产生了不一致。导致两个问题发生的原因有两点:

    • 在READ COMMITTED事务隔离级别下,事务没有使用gap lock进行锁定,因此用户在会话B可以在小于等于5的范围内插入一条记录
    • STATEMENT格式记录的是master上产生的SQL语句,因此在master服务器上执行的顺序为先删后插,但是在STATEMENT格式中记录的确实先插后删,逻辑顺序上产生了不一致
  • 要避免主从不一致的问题,只需解决上述问题中的一个就能保证数据的同步了。如使用READ REPEATABLE的事务隔离级别可以避免上述第一种情况的发生,也就避免了master和slave数据不一致的问题
  • 在MySQL 5.1版本之后,因为支持了ROW格式的二进制日志格式,避免了第二种情况的发生,所以可以放心使用READ COMMITTED的事务隔离级别。但即使不使用READ COMMITTED的事务隔离级别,也应该考虑将二进制日志的格式更换为ROW,因为这个格式记录的是行的变更,而不是简单的SQL语句,可以避免一些不同现象的产生,进步一保证数据的同步。InnoDB存储引擎的创始人JeikkiTurri也在MySQL Bugs: #33210: SBR & read-committed / read-uncommitted transaction isolations yield an error这个帖子中建议使用ROW格式的二进制日志

MySQL(InnoDB剖析):43---事务之(事务隔离级别:READ UNCOMMITTED、READ COMMITTED、REPEATABLE READ、SERIALIZABLE)相关推荐

  1. MySQL(InnoDB剖析):42---事务之(事务控制语句:begin、commit、rollback、savepoint、transaction)

    一.事务的自动提交 默认情况下,没有使用begin显式开启事务,事务都是自动提交的 autocommit变量 该变量用于控制SQL语句是否自动提交(auto commit) 默认值为1,表示自动提交 ...

  2. mysql隔离级别加锁情况_MySQL数据库事务各隔离级别加锁情况--read committed amp;amp; MVCC...

    上节回顾 上篇记录了我对MySQL 事务 隔离级别read uncommitted的理解. 这篇记录我对 MySQL 事务隔离级别 read committed & MVCC 的理解. 前言 ...

  3. MySQL 之事务 及 其隔离级别

    MySQL 之事务 及 其隔离级别 /* 事务:表示一组操作(sql),要么同时成功,要么同时失败,那么这种操作就构成了一个事务. 例如: 张三 给 李四 转账 500元 (1)把张三的余额减少500 ...

  4. 《MySQL》入门基础知识点大全:数据库操作、增删改查、联表查询、常用函数、MD5加密、事务特性、隔离级别

    MySQL基础知识大全 1.操作数据库 1.1 创建表 1.2 修改表名 1.3 增加表的字段 1.4 修改表的字段 1.4.1 修改表的字段 1.4.2 修改表名 1.5 删除表的字段 1.6 删除 ...

  5. MySql事务4种隔离级别以及悲观锁和乐观锁

    前言:在那鬼公司呆着发现自己居然把事务给搞明白了. 缘由:公司做的一个项目在进行首页内容显示的时候发现查询结果特别慢,有时候需要一到五分钟才能显示出结果.于是乎,我就顺着SQL语句查询慢的原因找了下去 ...

  6. 一文彻底读懂MySQL事务的四大隔离级别

    前言 之前分析一个死锁问题,发现自己对数据库隔离级别理解还不够深入,所以趁着这几天假期,整理一下MySQL事务的四大隔离级别相关知识,希望对大家有帮助~ 事务 什么是事务? 事务,由一个有限的数据库操 ...

  7. MySQL事务原理之事务概述和隔离级别

    MySQL事务概述和隔离级别 事务 事务的特征 事务的控制语句 事务的生命周期 事务执行过程 ACID特性 原子性(A) 一致性(C) 隔离性(I) 持久性(D) 隔离级别 命令 不同隔离级别并发异常 ...

  8. 数据库事务4种隔离级别和7种传播行为

    一.数据库隔离级别:是在在数据库操作中,为了有效保证并发读取数据的正确性提出的. 隔离级别越高,越能保证数据的完整性和一致性,但是对并发性能的影响也越大.对于多数应用程序,可以优先考虑把数据库系统的隔 ...

  9. 脏读、不可重复读 共享锁、悲观锁 和 事务五种隔离级别

    http://www.cnblogs.com/adforce/archive/2011/04/20/2021929.html 一.脏读.不可重复读.幻读 1.脏读:脏读就是指当一个事务正在访问数据,并 ...

最新文章

  1. Mysql添加字段.md
  2. java学习(132):hashtable使用map替代实体数据
  3. 关于插件管理器Alcatraz的一些问题
  4. linux lvm 删除pv磁盘,如何安全的删除Linux LVM中的PV物理卷(硬盘或分区)
  5. Gerrit配置--用户配置
  6. python 多个装饰器的调用顺序
  7. 程序员,成为北京人,只差月薪 7w 了。
  8. 2010-10-08在浏览器中兼容+jQuery3
  9. elasticsearch删除索引
  10. linux下物理内存不足,vm中linux物理内存不足解决方案
  11. iphone已停用怎么解锁_iPhone锁屏密码忘记了怎么办?维修店老板说出了绝招
  12. oracle sql 取日期,Oracle SQL日期及日期格式获取命令,oraclesql
  13. 【读书笔记】掌控习惯_詹姆斯克里尔
  14. 全球十大智能物流装备龙头企业
  15. linux离线日志分析工具,loganalyzer——日志分析工具
  16. 线性卷积和循环卷积(圆周卷积)
  17. python音频频谱分析软件_SpectrumView(音频频谱分析软件)
  18. 3D游戏里的男女性角色模型是这样建模出来的
  19. 基于4G工业路由器的智慧厕所管理方案
  20. 有没有什么帮助睡眠的东西?助眠效果好的东西分享

热门文章

  1. excel的EOMONTH函数及其用法
  2. “Learned” Operating Systems
  3. 路由器NAT类型检测
  4. MB1C MIGO入库时【不可能为条目A999 GBB CN01 BSA 7920确立帐户】解决方案
  5. 自行设计函数实现字符串复制
  6. 重视网络安全,从部署SSL证书开始
  7. cn域名保护隐私_域名隐私保护的含义及获取方法
  8. 利用ms17-010 远程执行漏洞渗透Win7,并留下后门
  9. wepack scope hoisting
  10. 记一次磁盘扩容,以及Can‘t open /dev/vdb1 exclusively. Mounted filesystem?报错处理的过程