深入理解mysql的隔离级别
建表插入测试数据
A> create table test(id int ,num int) ;
Query OK, 0 rows affected (0.53 sec)
A> insert into test values(1,1);
Query OK, 1 row affected (0.01 sec)
A> insert into test values(2,2);
Query OK, 1 row affected (0.00 sec)
A> insert into test values(3,3);
Query OK, 1 row affected (0.01 sec)
A> select * from test ;
+------+------+
| id | num |
+------+------+
| 1 | 1 |
| 2 | 2 |
| 3 | 3 |
+------+------+
3 rows in set (0.00 sec)
A> show create table test ;
+-------+----------------------------------------------------------------------------------------------------------------------+
| Table | Create Table |
+-------+----------------------------------------------------------------------------------------------------------------------+
| test | CREATE TABLE `test` (
`id` int(11) DEFAULT NULL,
`num` int(11) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8 |
+-------+----------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)
一。隔离级别read uncommitted,事物A可以读到事物B的未提交数据,未提交数据称为脏数据,因此叫脏读。
A> set session transaction isolation level read uncommitted ;
Query OK, 0 rows affected (0.00 sec)
A> SELECT @@tx_isolation ;
+------------------+
| @@tx_isolation |
+------------------+
| READ-UNCOMMITTED |
+------------------+
1 row in set (0.00 sec)
A> start transaction ;
Query OK, 0 rows affected (0.00 sec)
A> select * from test ;
+------+------+
| id | num |
+------+------+
| 1 | 1 |
| 2 | 2 |
| 3 | 3 |
+------+------+
3 rows in set (0.00 sec)
B> start transaction ;
Query OK, 0 rows affected (0.00 sec)
B> update test set num=10 where id=1 ;
Query OK, 1 row affected (0.01 sec)
Rows matched: 1 Changed: 1 Warnings: 0
B> select * from test ;
+------+------+
| id | num |
+------+------+
| 1 | 10 |
| 2 | 2 |
| 3 | 3 |
+------+------+
3 rows in set (0.00 sec)
A> select * from test ;
+------+------+
| id | num |
+------+------+
| 1 | 10 |
| 2 | 2 |
| 3 | 3 |
+------+------+
3 rows in set (0.01 sec)
B> rollback ;
Query OK, 0 rows affected (0.01 sec)
B> select * from test ;
+------+------+
| id | num |
+------+------+
| 1 | 1 |
| 2 | 2 |
| 3 | 3 |
+------+------+
3 rows in set (0.00 sec)
A> select * from test ;
+------+------+
| id | num |
+------+------+
| 1 | 1 |
| 2 | 2 |
| 3 | 3 |
+------+------+
3 rows in set (0.00 sec)
二。隔离级别read committed ,
对于事物B未提交的DML操作,事物A是看不到的
但是事物A在本身事物操作的过程中(未做commit or rollback),可以读到事物B的已提交数据,这就是不可重复读
下面测试下:
A> set session transaction isolation level read committed ;
Query OK, 0 rows affected (0.00 sec)
A> start transaction ;
Query OK, 0 rows affected (0.00 sec)
A> select * from test ;
+------+------+
| id | num |
+------+------+
| 1 | 1 |
| 2 | 2 |
| 3 | 3 |
+------+------+
3 rows in set (0.00 sec)
B>start transaction ;
Query OK, 0 rows affected (0.00 sec)
B>update test set num=20 where id=1 ;
Query OK, 1 row affected (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 0
B>rollback ;
Query OK, 0 rows affected (0.01 sec)
B>start transaction ;
Query OK, 0 rows affected (0.00 sec)
B>insert into test values(4,4) ;
Query OK, 1 row affected (0.00 sec)
B>select * from test;
+------+------+
| id | num |
+------+------+
| 1 | 1 |
| 2 | 2 |
| 3 | 3 |
| 4 | 4 |
+------+------+
4 rows in set (0.00 sec)
B>rollback ;
Query OK, 0 rows affected (0.01 sec)
B>start transaction ;
Query OK, 0 rows affected (0.00 sec)
B>delete from test where id =1 ;
Query OK, 1 row affected (0.01 sec)
B>select * from test;
+------+------+
| id | num |
+------+------+
| 2 | 2 |
| 3 | 3 |
+------+------+
2 rows in set (0.00 sec)
B>rollback ;
Query OK, 0 rows affected (0.01 sec)
在事物B做这些DML操作的时候,事物A的查询结果一直没变,此时事物A尚未结束
A> select * from test ;
+------+------+
| id | num |
+------+------+
| 1 | 1 |
| 2 | 2 |
| 3 | 3 |
+------+------+
3 rows in set (0.00 sec)
提交事物B的某个操作,事物A里面的对表test的查询结果就变了,因此事物A里面对test表的查询是不可重复的,所以叫不可重复读
三。隔离级别repeatable read
mysql的默认事物隔离级别,防止了脏读和不可重复读,但可能出现幻读
该隔离级别解决了不重复读,保证了同一个事务里,查询的结果都是事务开始时的状态(一致性)。
但是,如果另一个事务同时提交了新数据,本事务再更新时,就会“惊奇的”发现了这些新数据,貌似之前读到的数据是“鬼影”一样的幻觉。
A> set session transaction isolation level repeatable read ;
Query OK, 0 rows affected (0.00 sec)
A> select @@session.tx_isolation ;
+------------------------+
| @@session.tx_isolation |
+------------------------+
| REPEATABLE-READ |
+------------------------+
1 row in set (0.00 sec)
A> start transaction ;
Query OK, 0 rows affected (0.00 sec)
A> select * from test ;
+------+------+
| id | num |
+------+------+
| 1 | 1 |
| 2 | 2 |
| 3 | 3 |
+------+------+
3 rows in set (0.00 sec)
B> start transaction ;
Query OK, 0 rows affected (0.00 sec)
B> update test set num=10 where id=1 ;
Query OK, 1 row affected (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 0
B> select * from test ;
+------+------+
| id | num |
+------+------+
| 1 | 10 |
| 2 | 2 |
| 3 | 3 |
+------+------+
3 rows in set (0.00 sec)
B> commit ;
Query OK, 0 rows affected (0.01 sec)
此处A的修改应该是num=3才对,但是因为幻读,事物B虽然提交了,但事物A读到的还是旧记录,
如同幻影一般,事物A修改后,发现结果是30,而不是想要的结果3
A> update test set num=num*3 where id=1 ;
Query OK, 1 row affected (0.03 sec)
Rows matched: 1 Changed: 1 Warnings: 0
A> select * from test ;
+------+------+
| id | num |
+------+------+
| 1 | 30 |
| 2 | 2 |
| 3 | 3 |
+------+------+
3 rows in set (0.00 sec)
A> commit ;
Query OK, 0 rows affected (0.01 sec)
四。隔离级别SERIALIZABLE
SERIALIZABLE事务隔离级别最严厉,在进行查询时就会对表或行加上共享锁,其他事务对该表将只能进行读操作,而不能进行写操作。
A> set session transaction isolation level serializable ;
Query OK, 0 rows affected (0.00 sec)
A> select @@session.tx_isolation ;
+------------------------+
| @@session.tx_isolation |
+------------------------+
| SERIALIZABLE |
+------------------------+
1 row in set (0.00 sec)
A> start transaction ;
Query OK, 0 rows affected (0.00 sec)
A> select * from test ;
+------+------+
| id | num |
+------+------+
| 1 | 1 |
| 2 | 2 |
| 3 | 3 |
+------+------+
3 rows in set (0.00 sec)
B> start transaction ;
Query OK, 0 rows affected (0.00 sec)
B> update test set num=3 where id=1 ;
ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction
控制超时的参数
innodb_lock_wait_timeout | 120
深入理解mysql的隔离级别的更多相关文章
- 五分钟后,你将真正理解MySQL事务隔离级别!
什么是事务? 事务是一组原子性的SQL操作,所有操作必须全部成功完成,如果其中有任何一个操作因为崩溃或其他原因无法执行,那么所有的操作都不会被执行.也就是说,事务内的操作,要么全部执行成功,要么全部执 ...
- MYSQL事件隔离级别以及复读,幻读,脏读的理解
一.mysql事件隔离级别 1未提交读(READUNCOMMITTED) 另一个事务修改了数据,但尚未提交,而本事务中的SELECT会读到这些未被提交的数据(脏读)( 隔离级别最低,并发性能高 ) 2 ...
- [51CTO]新说MySQL事务隔离级别!
新说MySQL事务隔离级别! 事务隔离级别这个问题,无论是校招还是社招,面试官都爱问!然而目前网上很多文章,说句实在话啊,我看了后我都怀疑作者弄懂没!本文所讲大部分内容,皆有官网作为佐证,因此对本文内 ...
- 查询mysql事务隔离级别
查询mysql事务隔离级别 查询mysql事务隔离级别 分类: DB2011-11-26 13:12 2517人阅读 评论(0) 收藏 举报 mysqlsessionjava 1.查看当前会话隔离 ...
- mysql数据库隔离级别
# 原创,转载请留言联系 事务的隔离级别 (由高到低)1.串行化(serializable):一个事务一个事务的执行2.可重复读(Repeatable-Read) 可重复读,无论其他事务是否修改并提交 ...
- Mysql事务-隔离级别
MYSQL事务-隔离级别 事务是什么? 事务简言之就是一组SQL执行要么全部成功,要么全部失败.MYSQL的事务在存储引擎层实现. 事务都有ACID特性: 原子性(Atomicity):一个事务必须被 ...
- 查询和设置mysql事务隔离级别
1.查看当前会话隔离级别 select @@tx_isolation; 2.查看系统当前隔离级别 select @@global.tx_isolation; 3.设置当前会话隔离级别 set sess ...
- mysql数据库隔离级别及其原理、Spring的7种事物传播行为
一.事务的基本要素(ACID) 1.原子性(Atomicity):事务开始后所有操作,要么全部做完,要么全部不做,不可能停滞在中间环节.事务执行过程中出错,会回滚到事务开始前的状态,所有的操作就像没有 ...
- Mysql事务隔离级别和锁机制
一.Spring支持四种事务隔离级别: 1.ISOLATION_READ_UNCOMMITTED(读未提交):这是事务最低的隔离级别,它充许令外一个事务可以看到这个事务未提交的数据. 2.ISOLAT ...
随机推荐
- 什么是Spark(三)数据的加载和保存
Spark内置了一些常见的文件格式的处理,包括text/json,csv,sequence等:Spark对于文件处理保持了开放性,还提供了可以通过InputFormat,OutputFormat来进行 ...
- 最近项目和java对接,涉及到java的DESede加解密算法
google后找到这个作者的一篇博客,搬过来用 http://hersface.com/page/17.html <?php class DESede{ /** * 加密 * @param $d ...
- CentOS部署NetCore - 3. 部署站点
一. CentOS 安装FTP linux 安装 ftp第一步 使用如下命令#rpm -qa |grep vsftpd可以检测出是否安装了vsftpd软件, 如果没有安装,使用YUM命令进行安装. y ...
- awk:NF-NR-OFS-ORS-RS等参数
ARGC 命令行参数个数ARGV 命令行参数排列ENVIRON 支持队列中系统环境变量的使用FILENAME awk浏览的文件名FNR 浏览文件的记录数FS 设置输入域分隔符,等价于命令行 -F选项N ...
- Makefile编写 五 隐含规则
隐含规则———— 在我们使用Makefile时,有一些我们会经常使用,而且使用频率非常高的东西,比如,我们编译C/C++的源程序为中间目标文件(Unix下是[.o]文件,Windows下是[.obj] ...
- erlang学习之自定义behaviour
behaviour是啥,看了资料做了demo以后,感觉像接口,话不多说,祭代码 R15开始,回调模型使用callback来约定,更加好理解了 test_behavior.erl -module(tes ...
- [Java.Web]Tomcat 常用配置
1. web.xml 文件最下方内容 (X:\apache-tomcat-7.0.77\conf\ 目录下) <welcome-file-list> <welcome-file> ...
- mongoDB在windows下安装和配置.
1.首先在官网下载mongoDB的安装包: http://www.mongodb.org/downloads 这里我们下载zip格式的下载,其他的没安装过,不会,就不说了. 2.解压文件后: 3.在D ...
- Druid.io系列(一):简介
原文链接: https://blog.csdn.net/njpjsoftdev/article/details/52955676 Druid.io(以下简称Druid)是面向海量数据的.用于实时查询与 ...
- 在spring中该如何使用DTO,以及DTO和Entity的关系
1. DTO是用于将后台的数据结构(javaBean)转换为对用户友好的表现方式的数据结构,同时也能防止后台数据直接传送到前台而存在的潜在危险. 2. 可以时候要哪个springbot框架提供的转换器 ...