事务隔离级别的语义:当前事务执行过程中,通过select,update,delete 操作,对其他事务的影响,反过来也是如此,通俗的说就是 当前事务是否可以看到其他事务的操作结果。

1、如何查询当前数据库的隔离级别(我们只讨论mysql的事务隔离级别)

select @@tx_isolation;
SELECT @@session.tx_isolation;
SELECT @@global.tx_isolation;
//设置
set tx_isolation='read-committed';

2、不同隔离级别的影响

ANSI/ISO SQL标准定义了4中事务隔离级别:未提交读(read uncommitted),提交读(read committed),重复读(repeatable read),串行读(serializable)。

对于不同的事务,采用不同的隔离级别分别有不同的结果。不同的隔离级别有不同的现象。主要有下面3种现在:

1、脏读(dirty read):一个事务可以读取另一个尚未提交事务的修改数据。

2、不可重复读(nonrepeatable read):在同一个事务中,同一个查询在T1时间读取某一行,在T2时间重新读取这一行时候,这一行的数据已经发生修改,可能被更新了(update),也可能被删除了(delete)。

3、幻像读(phantom read):在同一事务中,同一查询多次进行时候,由于其他插入操作(insert)的事务提交,导致每次返回不同的结果集。

不同的隔离级别有不同的现象,并有不同的锁定/并发机制,隔离级别越高,数据库的并发性就越差,4种事务隔离级别分别表现的现象如下表:

隔离级别 脏读 非重复读 幻像读
read uncommitted 允许 允许 允许
read committed   允许 允许
repeatable read     允许
serializable      
 

mysql 默认的隔离级别是:REPEATABLE-READ 

 

注意:

1、repeatable read 允许幻读,这是ANSI/ISO SQL标准的定义要求,运行幻读依然有非常大的隐患,mysql 在repeatable read  即可满足没有幻读的要求。

2、不可重复读和幻读的区别:不可重复读的重点是修改,幻读的重点是插入或者删除了新数据。两都会造成系统错误,但是避免的方法则区别比较大,对于前者, 只需要锁住满足条件的记录,对于后者, 要锁住满足条件及其相近的记录。

举例验证:

1、建表

CREATE TABLE `t_pai` (`id` bigint(20) NOT NULL AUTO_INCREMENT,`name` varchar(10) NOT NULL,`update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',PRIMARY KEY (`id`),KEY `idx_update_time` (`update_time`)) ENGINE=InnoDB DEFAULT CHARSET=utf8

2、验证不存在幻读

client1 :SET autocommit= 0;

client2:SET autocommit= 0;

client1:START TRANSACTION;

client2:

START TRANSACTION;

INSERT INTO t_pai (`name`) VALUE ("2");

COMMIT;

client1:SELECT * FROM t_pai;

结果:查询不到数据:

client1:

COMMIT;

SELECT * FROM t_pai;

结果:有数据。

深层次的原理分析:

在MVCC并发控制中,读操作可以分成两类:快照读 (snapshot read)与当前读 (current read)。

快照读,读取的是记录的可见版本 (有可能是历史版本),不用加锁。

当前读,读取的是记录的最新版本,并且,当前读返回的记录,都会加上锁,保证其他事务不会再并发修改这条记录

在一个支持MVCC并发控制的系统中,哪些读操作是快照读?哪些操作又是当前读呢?以MySQL InnoDB为例:

  • 快照读:简单的select操作,属于快照读,不加锁。(当然,也有例外,下面会分析)

    • select * from table where ?;

  • 当前读:特殊的读操作,插入/更新/删除操作,属于当前读,需要加锁。

    • select * from table where ? lock in share mode;

    • select * from table where ? for update;

    • insert into table values (…);

    • update table set ? where ?;

    • delete from table where ?;

    所有以上的语句,都属于当前读,读取记录的最新版本。并且,读取之后,还需要保证其他并发事务不能修改当前记录,对读取记录加锁。其中,除了第一条语句,对读取记录加S锁 (共享锁)外,其他的操作,都加的是X锁 (排它锁)。

MySQL/InnoDB定义的4种隔离级别:

  • Read Uncommited

    可以读取未提交记录。此隔离级别,不会使用,忽略。

  • Read Committed (RC)

    快照读忽略,本文不考虑。

    针对当前读,RC隔离级别保证对读取到的记录加锁 (记录锁),存在幻读现象。

  • Repeatable Read (RR)

    快照读忽略,本文不考虑。

    针对当前读,RR隔离级别保证对读取到的记录加锁 (记录锁),同时保证对读取的范围加锁,新的满足查询条件的记录不能够插入 (间隙锁),不存在幻读现象。

  • Serializable

    从MVCC并发控制退化为基于锁的并发控制。不区别快照读与当前读,所有的读操作均为当前读,读加读锁 (S锁),写加写锁 (X锁)。

    Serializable隔离级别下,读写冲突,因此并发度急剧下降,在MySQL/InnoDB下不建议使用。

mysql-repeatable read可以避免幻读相关推荐

  1. MySQL RR隔离级别解决幻读问题?

    首先,讲mysql的隔离级别之前需要复习一下事务的四个特性 (注:mysql存储引擎InnoDB)(待完善) 事务的四个特性(ACID): 原子性(Atomicity) 一致性(Consistency ...

  2. mysql可重复读和幻读的理解

    mysql可重复读和幻读的理解 可重复读和幻读的定义 最后总结 参考资料 很多教程和书籍对mysql的可重复读和幻读的解释都比较含糊,本文结合原理和其他的考证,深入分析下. 这里讨论的引擎是常用的In ...

  3. mysql串行化防幻读原理_透彻解读mysql的可重复读、幻读及实现原理

    目录 一.事务的隔离级别 二.mysql怎么实现的可重复读 举例说明MVCC的实现 MVCC逻辑流程-插入 MVCC逻辑流程-删除 MVCC逻辑流程-修改 MVCC逻辑流程-查询 三.幻读 快照读和当 ...

  4. MYSQL专题: 脏读、幻读、不可重复读区别及解决方案

    并发场景下事务会存在那些数据问题? 并发场景下mysql会出现脏读.幻读.不可重复读问题: 1. 脏读 dirty read(读到未提交的数据): A事务正在修改数据但未提交,此时B事务去读取此条数据 ...

  5. MySQL 到底是怎么解决幻读的?

    作者:LastSun https://www.cnblogs.com/wdy1184/p/10655180.html 一.什么是幻读 在一次事务里面,多次查询之后,结果集的个数不一致的情况叫做幻读.而 ...

  6. mysql 中的脏读与幻读_一文带你理解脏读,幻读,不可重复读与mysql的锁,事务隔离机制...

    首先说一下数据库事务的四大特性 1 ACID 事务的四大特性是ACID(不是"酸"....) (1) A:原子性(Atomicity) 原子性指的是事务要么完全执行,要么完全不执行 ...

  7. mysql 脏读 不可重复读 幻读_mysql事务隔离级别/脏读/不可重复读/幻读详解

    一.四种事务隔离级别 1.1read uncommitted 读未提交 即:事务A可以读取到事务B已修改但未提交的数据. 除非是文章阅读量,每次+1这种无关痛痒的场景,一般业务系统没有人会使用该事务隔 ...

  8. mysql的mvcc如何解决幻读_MySQL InnoDB MVCC 能否完全解决幻读?

    幻读是指多事务并发中一个事务读到了另一个事务insert的记录. 在REPEATABLE READ隔离级别下,假设事务T1执行后,事务T2开始执行,并新增一条记录,然后事务T2提交,这时在事务T1中执 ...

  9. mysql事务ACID原理MVCC 幻读

    文章目录 mysql事务原理MVCC 1存储引擎 1.InnoDB存储引擎 2.MyISAM存储引擎 2.undo和redo的功能 undo: redo: 3.mysql锁 3.1表级锁 3.2行级锁 ...

  10. MySQL到底是如何解决幻读问题

    要知道什么是幻读,首先要知道以下四点: 一.幻读定义 幻读是指在同一个事务中,存在前后两次查询同一个范围的数据,但是第二次查询却看到了第一次查询没看到的行,一般情况下特指事务执行中新增的其他行. 二. ...

最新文章

  1. Eclipse调试Debug技巧
  2. python反编译工具uncompyle的安装与用法
  3. 处理字符串_14_SQL处理IN和合并后字符串案例详解
  4. # PHP - 使用PHPMailer发邮件
  5. 如何优雅地实现 C 编译期静态反射
  6. NeurIPS2021 VALUE:快来刷榜吧!微软提出视频多模态新基准,同时含检索、caption、QA等多个任务!...
  7. sql azure 语法_使用Visual Studio和SQL Azure数据库
  8. python中哪些词是敏感字词_敏感词库(收集2017年最新最全敏感词) 2017 最新版
  9. 内蒙古自治区包头市谷歌高清卫星地图下载
  10. 【人机交互技术】Web界面设计
  11. win7系统中如何使文件显示出扩展名
  12. java求正方形的面积周长_三角形正方形 圆和正五边形的周长和面积计算 java实现.doc...
  13. 计算机网络谢希仁第七版课后习题答案(第九章)
  14. python微信公众号文章转pdf
  15. [ZJOI2009]狼和羊的故事 题解
  16. [windows Tools] windows程序打包工具-Advanced Installer 10.0
  17. 饭后七个好习惯吃饱吃好不发胖
  18. 计算机电脑关机后可以充电吗,电脑关机了还能充电吗
  19. WR | 西湖大学鞠峰组微纳塑料污染对人工湿地菌群与脱氮功能的影响
  20. html5 指南针,html5指南针实现

热门文章

  1. Tomcat做成系统服务
  2. android抽屉效果
  3. 基于opencv python 的网线线序识别(三)
  4. 3DLC系列之:自动匹配颜色
  5. vue 渲染函数处理slot_Vue渲染函数详解
  6. 计算机10进制213.375怎样转化为二进制,2进制转10进制(二进制怎么算)
  7. java read dxf xdata_DXF格式文件数据提取
  8. TortoiseSVN简明教程
  9. 海马玩安卓模拟器-安装流程详解
  10. 盘点近年25家外卖O2O,谁比谁难过