文章系转载,复制到这里方便自己收藏和整理看,原文地址 https://www.cnblogs.com/leohahah/p/8857124.html

参考自:https://dev.mysql.com/doc/refman/5.6/en/innodb-transaction-isolation-levels.html

第一部分:概述

InnoDB遵循SQL:1992标准,提供READ UNCOMMITTED, READ COMMITTED, REPEATABLE READ和SERIALIZABLE四种事务隔离级别。InnoDB默认使用的事务隔离级别是REPEATABLE READ。

用户可以自己修改会话或全局级别的事务隔离级别,语法如下:

SET [GLOBAL | SESSION] TRANSACTION
transaction_characteristic [, transaction_characteristic] ...
transaction_characteristic:
ISOLATION LEVEL level
| READ WRITE
| READ ONLY
level:
REPEATABLE READ
| READ COMMITTED
| READ UNCOMMITTED
| SERIALIZABLE

你也可以在启动时添加–transaction-isolation启动项或者将其写入配置文件,来设置相应的全局事务隔离级别。

READ UNCOMMITTED, READ COMMITTED, REPEATABLE READ和SERIALIZABLE这四种事务隔离级别所提供的事务一致性是越来越强的,但是并发性却是却来越差的。

第二部分:事务隔离级别

提到事务隔离级别就必须先明确以下三种读:

脏读:读到了其他事务已修改但未提交的数据
不可重复读:由于其他事务的修改,导致同一事务中两次查询读到的数据不同
幻读:由于其他事务的修改,导致同一事务中两次查询读到的记录数不同

1.READ UNCOMMITTED

这种隔离级别下普通select语句是不加事务锁的,因此会产生脏读,这种事务隔离级别是应当完全避免的。除select语句以外的其他语句加锁模式与READ COMMITTED一样。

2.READ COMMITTED

同REPEATABLE READ一样,这种隔离级别下也实现了一致性非锁定读,但区别在于此隔离级别下的一致性读是语句级的,即只能避免脏读,不能避免不可重复读和幻读。其实现方式大致是:

  • 一致性非锁定读的select语句检测要锁定的索引记录上是否有独占锁(在server层也会添加S模式的record lock,此锁为server层的元数据库锁,非innodb事务锁)。
  • 如果有独占锁那么到undo中寻找最近的前镜像。
  • 如果没有独占锁那么直接读取数据。

在这种隔离级别下,InnoDB的锁定读(SELECT with FOR UPDATE or LOCK IN SHARE MODE)只使用record lock类型的行锁,不使用gap锁。

此外:如果你使用READ COMMITTED事物隔离级别,那么binlog模式必须修改为row模式!

关于具体的MVCC实现方式,MySQL官网并未提供具体的实现步骤,可以选择去查看源码,也可以参考Oracle和SQL Server的实现机制。

3.REPEATABLE READ

这是MySQL的默认事务隔离级别。在一个事务当中第一次读会建立一个全库snapshot,同事务下的select语句会读取这个snapshot来实现一致性非锁定读。而第一个snapshot的建立猜测与READ COMMITTED下的读取机制一样。同事务的select语句会读取这个snapshot的数据来实现一致性非锁定读,这个snapshot是针对整个数据库中所有支持MVCC机制的表的,即在snapshot建立后读取任意其他表都只会读取到snapshot中的快照数据,示例如下:

时刻一,A会话执行:select * from T2 where id=1;
时刻二,A会话执行:start transaction; select * from T1; --snapshot建立
时刻三,B会话执行:针对T1表和T2表的DML语句修改数据
时刻四,A会话执行:select * from T1; --发现读到的数据与时刻二一模一样,证明表T1实现了一致性读
时刻五,A会话执行:select * from T2 where id=1; --发现读到的数据与时刻一一致,证明snapshot非表级,而是库级

这种隔离级别下可以避免脏读、不可重复读和幻读。

对于select for update/select lock in share mode/update/delete这些锁定读,加行锁模式取决于索引的类型:

  • 对唯一索引的访问只会添加record lock,而不会使用gap lock(即也没有next-key lock)。
  • 对非唯一索引的访问使用gap lock或者next-key lock,如果访问的记录不存在就是gap lock,否则就是next-key lock。

4.SERIALIZABLE

这种事务隔离级下select语句即便不加lock in share mode也使用lock_mode=S的行锁,select自成事务,锁直到事务结束才释放。

这种隔离级别下可以避免脏读、不可重复读和幻读。

DML语句的加锁模式与REPEATABLE READ一样。

官网对于这个隔离级别的解释是只有将autocommit设置为0后select才会被隐式转换为lock in share mode的加锁模式,但是经测验发现在此模式下只要为select语句开启事务就会阻塞其他事物的更改,因此官网解释应该有误。

第三部分:总结

一般来说我们没必要去修改默认的事务隔离级别,因为修改事务隔离级别为read commited对于性能并无明显提升。当然如果你的数据库并不在意幻读和不可重复读,可以修改为read committed隔离级别,这样可以略微的增加并发减少阻塞,据说淘宝也是这么干的,Oracle默认的事务隔离级别也是read committed,同样不可避免幻读和不可重复读。

此外需要注意的是如果想要Innodb支持全局分布式事务,那么事物隔离级别最好设置为serializable read,且innodb_support_xa项必须为1(另外为确保innodb的二阶段日志提交innodb_support_xa也是必须开启的,这其实是一种内部的分布式机制但无需serializable read的隔离级别)。

关于MySQL的锁机制,可以参考:http://www.cnblogs.com/leohahah/p/8862216.html

其他:

关于一致性非锁定读和锁定读的解释,详见MySQL各类SQL语句的加锁机制。

[转载]MySQL事务隔离级别相关推荐

  1. 5、MySQL事务隔离级别详解

    事务的隔离性就是指当多个事务同时运行时,各事务之间相互隔离,不可互相干扰.如果事务没有隔离性,就容易出现脏读.不可重复读和幻读等情况. 为了保证并发时操作数据的正确性,数据库都会有事务隔离级别的概念. ...

  2. Mysql事务隔离级别及MVCC(多版本并发控制)

    一.MySQL事务隔离级别 先注明一点:以下讨论都是在多事务并发的情境下讨论的 事务的特性(InnoDB引擎才有事务): ACID 原子性:一个事务不可再分割,要么都执行要么都不执行 一致性:一个事务 ...

  3. mysql 事务 隔离级别_MySQL的四种事务隔离级别

    https://www.cnblogs.com/huanongying/p/7021555.html 本文实验的测试环境:Windows 10+cmd+MySQL5.6.36+InnoDB 一.事务的 ...

  4. mysql事务隔离级别 花_mysql事务隔离级别

    很多PHP开发者在面试的时候遇到这个问题都会卡壳.这是因为理解得不够透彻,今天让我带领大家梳理一下mysql事务隔离级别 数据库有四种隔离级别,分别是Read uncommitted,Read com ...

  5. mysql事务隔离级别之锁实现原理,脏读、不可重复读、幻读出现原因及解决方案

    mysql事务隔离级别原理 观看了很多网上的博客,挺令人伤心,很难找到想要的答案... 一:所需知识 1,mysql中的锁 1.1,读锁(共享锁) 规则:若事务1对数据对象A加上读锁,则事务1只能读A ...

  6. 揭秘Mysql事务隔离级别之可重复读

    揭秘Mysql事务隔离级别之可重复读 1.可重复读的来源 2.何为不可重复读 3.那么可重复读和不可重复读究竟有什么关系呢? 4.模拟不同事务隔离级别对不可重复的处理情况(有线程执行顺序). 4.1. ...

  7. mysql 事务隔离级别实现原理_MySQL事务隔离级别和实现原理 - 米扑博客

    开发中经常提到数据库的事务,那你知道数据库还有事务隔离的说法吗, 事务隔离还有隔离级别,那什么是事务隔离,隔离级别又是什么呢? MySQL 事务 本文所说的 MySQL 事务都是指在 InnoDB 引 ...

  8. 数据库事务转载基础二:MySQL事务隔离级别详解

    SQL标准定义了4类隔离级别,包括了一些具体规则,用来限定事务内外的哪些改变是可见的,哪些是不可见的.低级别的隔离级一般支持更高的并发处理,并拥有更低的系统开销. Read Uncommitted(读 ...

  9. MySQL事务隔离级别介绍

    SQL标准定义了4类隔离级别,包括了一些具体规则,用来限定事务内外的哪些改变是可见的,哪些是不可见的.低级别的隔离级一般支持更高的并发处理,并拥有更低的系统开销. Read Uncommitted(读 ...

  10. MYSQL事务隔离级别详解附加实验

    参考: https://dev.mysql.com/doc/refman/5.7/en/set-transaction.html http://xm-king.iteye.com/blog/77072 ...

最新文章

  1. Python是世界上最好的语言,你不服不行!(附资料)
  2. JavaScript创建元素的三种方法特点及对元素的操作
  3. Java 数组长度和访问
  4. VC++2019 使用wininet下载文件
  5. 机器人学习--路径规划算法
  6. PHP连接sql seaver数据库
  7. 飞秋2010下载不仅野草是如此
  8. 2021-01-25
  9. Kyligence李扬:数据智能推荐成为技术发展新方向
  10. 通用权限管理系统组件 (GPM - General Permissions Manager) 中实现系统参数配置保存,附源码...
  11. [渝粤教育] 西南科技大学 管理学原理 在线考试复习资料
  12. ajax post form表单提交中文乱码,ajax XMLHTTP Post Form时的表单乱码综合解决
  13. 13.分布式锁面试题(高频面试题)
  14. stm32f103rbt6基本介绍
  15. 高精度室内外融合定位服务平台-“羲和”系统
  16. Xilinx平台SRIO介绍(六)SRIO收发测试
  17. 模糊聚类划分matlab代码,模糊C均值聚类算法(原理+Matlab代码) - 全文
  18. 数据库中的锁机制(数据库中有哪些锁)
  19. 批处理文件——多个QQ一键登录
  20. click和touchmove vue_移动端touch事件影响click事件以及在touchmove添加preventDefault导致页面无法滚动的解决方法...

热门文章

  1. L1-021 重要的话说三遍 (5 分) — 团体程序设计天梯赛
  2. putty界面最友好的颜色配置参考
  3. Ubuntu18.04 安装 Mysql 5.7 问题
  4. 【bug】VUE:Cannot read property '_withTask' of undefined
  5. [bzoj3670] [NOI2014] [lg2375] 动物园
  6. FullCalendar应用——整合农历节气和节日
  7. linux 连接到阿里云服务器
  8. 使用yum update更新文件系统时不更新内核的方法
  9. (转)C++类所占内存大小计算
  10. 在Windows平台下的IIS中发布Django应用