MySQL事务隔离级别总结

一、事务隔离问题

1、脏读:事务A对某数据进行了修改,但事务还没有提交。这时事务B来读取这个数据,会读到事务A修改后但还没有提交的数据。如果事务A撤销了对该数据的修改,那么事务B就读取到了脏数据,这个就叫脏读。

2、不可重复读:事务A读取一个数据,但事务还没有结束。这时事务B修改了这个数据后提交。事务A再次读取这个数据时,由于事务B修改并提交了这个数据,导致事务A前后两次读到的数据不一致,这个就叫不可重复读。

3、幻读:幻读应该是指事务A读取某个范围的数据,但事务还没有结束。这时事务B插入或删除了某条数据后提交。事务A是看不到事务B已经插入或删除的数据(因为不可重复读),再次插入或删除相同数据会出错,这个就是幻读。幻读的概念很多文章弄混淆了,说的是事务B插入数据后,事务A前后读取的数据不一致,这是不正确的,这叫不可重复读。如果实现了RR级别,是不会出现这种情况的。

二、四种事务隔离级别

1、读未提交 READ-UNCOMMITTED / RU
存在脏读、不可重复读、幻读的问题。

2、读已提交 READ-COMMITTED / RC
解决了脏读的问题,但存在不可重复读、幻读的问题。

3、可重复读 REPEATABLE-READ / RR(默认)
解决了脏读、不可重复读的问题,但存在幻读的问题。是默认隔离级别,使用 MMVC机制实现可重复读。

4、序列化 SERIALIZABLE
解决了脏读、不可重复读、幻读的问题,可保证数据一致性,但各个事务完全串行化执行,性能最低。


事务隔离级别


脏读


不可重复读


幻读


读未提交(RU)





读已提交(RC)





可重复读(RR)





串行化(Serializable)




三、可重复读(RR)幻读问题验证

1、查看隔离级别命令
mysql> show global variables like ‘%isolation%‘;
+---------------+-----------------+
| Variable_name | Value |
+---------------+-----------------+
| tx_isolation | REPEATABLE-READ |
+---------------+-----------------+
1 row in set

或者

mysql> SELECT @@tx_isolation;
+-----------------+
| @@tx_isolation |
+-----------------+
| REPEATABLE-READ |
+-----------------+
1 row in set

2、幻读问题

网上很多文章对幻读问题的解释是不对的。认为幻读问题是某个事务插入数据后导致前面的事务读取的数据记录集不一样。比如,事务A执行两次select操作得到不同的数据集,第一次select得到10条记录,第二次select得到11条记录。这并不是幻读问题,这是不可重复读问题,但在mysql 默认的RR隔离级别是不会出现的。

幻读,并不是说两次读取的结果不一样。幻读侧重的是某一次select 操作后得到的数据无法用于后面的业务操作。比如,select 某记录,发现不存在,准备insert 此记录时,发现此记录已存在,插入报错,此时就是因为发生了幻读。

解决办法,可以在select 时加上X锁,select ... for update 避免幻读问题。事务A在select时加入x锁后,其他事务插入操作需要等待,相当于间接地串行化执行事务。

3、测试验证

有一张user 表保存了用户记录,user表初始状态共3条记录,如下:

mysql> select * from user;
+----+-----------+-----+-----+---------+
| id | user_name | age | sex | address |
+----+-----------+-----+-----+---------+
| 1 | zhangsan | 20 | 0 | cd |
| 2 | lisi | 21 | 1 | bj |
| 3 | wangwu | 21 | 1 | sh |
+----+-----------+-----+-----+---------+
3 rows in set

事务A和事务B分别执行如下操作:


时间


事务A


事务B


T1


Begin; 事务A开始执行


T1


select * from user; 查询结果只有3条记录


T3


Begin; 事务B开始执行


T4


insert into user values(4, ‘test‘, 24, 0, ‘tj‘);

事务B插入1条id=4记录


T5


Commit; 事务B提交


T6


select * from user;

事务A再次查询,结果和上次查询一致,是看不到事务B已经插入的id=4的记录


T7


insert into user values(4, ‘test‘, 24, 0, ‘tj‘);

事务A再次插入id=4的记录报错,由于幻读导致事务A以为不存在id=4的记录,插入后报错

 

原文地址:https://www.cnblogs.com/alan6/p/11623154.html

时间: 2024-07-31 21:56:49

MySQL事务隔离级别总结的相关文章

查询mysql事务隔离级别

查询mysql事务隔离级别 查询mysql事务隔离级别 分类: DB2011-11-26 13:12 2517人阅读 评论(0) 收藏 举报 mysqlsessionjava 1.查看当前会话隔离级别 select @@tx_isolation; 2.查看系统当前隔离级别 select @@global.tx_isolation; 3.设置当前会话隔离级别 set session transaction isolatin level repeatable read; 4.设置系统当前隔离级别 s

Mysql事务-隔离级别

MYSQL事务-隔离级别 事务是什么? 事务简言之就是一组SQL执行要么全部成功,要么全部失败.MYSQL的事务在存储引擎层实现. 事务都有ACID特性: 原子性(Atomicity):一个事务必须被视为一个不可分割的单元: 一致性(Consistency):数据库总是从一种状态切换到另一种状态: 隔离性(Isolation):通常来说,事务在提交前对于其他事务不可见: 持久性(Durablity):一旦事务提交,所做修改永久保存数据库: 事务最常用的例子就是银行转账.假设polo需给lynn转

MySQL事务隔离级别为"REPEATABLE-READ"下的"幻读"现象

MySQL事务隔离级别为"REPEATABLE-READ"下的"幻读"现象 关于mysql命令行中事务控制的语句见该文章:http://my.oschina.net/xinxingegeya/blog/296459 本片参考文章:http://blog.csdn.net/jiao_fuyou/article/details/16368827 http://www.cnblogs.com/hancf/archive/2012/08/28/2660422.html my

MySQL事务隔离级别详解

SQL标准定义了4类隔离级别,包括了一些具体规则,用来限定事务内外的哪些改变是可见的,哪些是不可见的.低级别的隔离级一般支持更高的并发处理,并拥有更低的系统开销.Read Uncommitted(读取未提交内容) 在该隔离级别,所有事务都可以看到其他未提交事务的执行结果.本隔离级别很少用于实际应用,因为它的性能也不比其他级别好多少.读取未提交的数据,也被称之为脏读(Dirty Read).Read Committed(读取提交内容) 这是大多数数据库系统的默认隔离级别(但不是MySQL默认的).

查询修改mysql事务隔离级别

1.查看当前会话隔离级别 select @@tx_isolation; 2.查看系统当前隔离级别 select @@global.tx_isolation; 3.设置当前会话隔离级别 set tx_isolation='read-committed'; 4.设置系统当前隔离级别 set global transaction isolation level read committed; 关于隔离级别的理解: 1.read uncommitted 可以看到未提交的数据(脏读),举个例子:别人说的话

mysql -- 事务隔离级别以及java中事务提交的步骤

SQL标准定义了四种隔离级别,不同隔离的级别使用不当会出现脏读.不可重复读和幻读的问题,隔离级别的出现是事务处理效率与安全的一种平衡. 隔离级别不同会出现的问题 脏读(Drity Read):某个事务已更新一份数据,另一个事务在此时读取了同一份数据,由于某些原因,前一个RollBack了操作,则后一个事务所读取的数据就会是不正确的. 不可重复读(Non-repeatable read):在一个事务的两次查询之中数据不一致,这可能是两次查询过程中间插入了一个事务更新的原有的数据. 幻读(Phant

mysql事务隔离级别与锁的关系

其实操作了这么久mysql一直也没有把mysql中事务跟锁的关系弄得特别清楚.然后搜到美团这篇文章,顺便结合一下自己遇到的问题总结一下. 首先事务有四种隔离级别: Reference: http://tech.meituan.com/innodb-lock.html Innodb中的事务隔离级别和锁的关系

图解MySQL事务隔离级别

本文主要通过大量的实例截图,来通俗的讲解MySQL的四种事务隔离级别的效果.关于事务隔离级别的概念以及不同隔离级别会引发的问题,大家可以自行百度,此处不再赘述. 标准数据库的四种事务隔离级别,不同隔离级别会引发的问题: 隔离级别 脏读 不可重复读 幻读 Read Uncommitted Y Y Y Read Committed N Y Y Repeatable Read N N Y Serializable N N N MySQL采用的默认隔离级别是Repeatable Read,我们可以用se

Mysql事务隔离级别学习

这篇文章主要谈谈Mysql事务隔离级别的区别,以及自己的一些感受. 自己一直以来没搞懂“可重复读”和可提交读“两者之间的区别,通过此次的实践,清楚了两者之间的区别.废话不说,先上图看看这几个事务隔离级别. Mysql数据库总共分为四个事务隔离级别,其中默认的事务隔离级别是:repeatable read,而与其它的数据库不同的是,其它的数据库默认事务隔离级别是read committed(SQL Server.Oracle). 第一步:SERIALIZABLE Instance 1: Insta

事务以及MySQL事务隔离级别+MySQL引擎的区别

1.事务的基本要素:ACID 1.原子性(Atomicity): 事务开始后所有操作,要么全部做完,要么全部不做,不可能停滞在中间环节.事务执行过程中出错,会回滚到事务开始前的状态,所有的操作就像没有发生一样.也就是说事务是一个不可分割的整体,就像化学中学过的原子,是物质构成的基本单位. 2.一致性(Consistency): 事务开始前和结束后,数据库的完整性约束没有被破坏 .比如 A 向 B 转账,不可能 A 扣了钱,B 却没收到. 3.隔离性(Isolation): 同一时间,只允许一个事