博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
MySQL隔离级别
阅读量:6107 次
发布时间:2019-06-21

本文共 3848 字,大约阅读时间需要 12 分钟。

http://blog.csdn.net/taylor_tao/article/details/7063639

事务具有ACID四种特性。

但是Isolation并发可能引起如下问题:

1.脏读

允许读取到未提交的脏数据。

2.不可重复读

如果你在时间点T1读取了一些记录,在T2时再想重新读取一次同样的这些记录时,这些记录可能已经被改变、或者消失不见。

3.幻读

解决了不重复读,保证了同一个事务里,查询的结果都是事务开始时的状态(一致性)。但是,如果另一个事务同时提交了新数据,本事务再更新时,就会“惊奇的”发现了这些新数据,貌似之前读到的数据是“鬼影”一样的幻觉。

 

由ANSI/ISO定义的SQL-92标准定义的四种隔离级别

1.Read Uncommitted

2.Read Committed

3.Repeatable Read

4.Serializable

隔离解别 脏读 不可重复读 幻读
Read Uncommitted Y Y Y
Read Committed N Y Y
Repeatable(default) N N Y
Serializable N N N

下面用Mysql数据库做一些小实验

Mysql 版本号

 

[sql]
  
 
  1. mysql> select version();  
  2. +------------+  
  3. | version()  |  
  4. +------------+  
  5. | 5.1.52-log |  
  6. +------------+  
  7. 1 row in set (0.00 sec)  

 

 

查看InnoDB存储引擎 系统级的隔离级别 和 会话级的隔离级别

[sql]
  
 
  1. mysql> select @@global.tx_isolation,@@tx_isolation;  
  2. +-----------------------+-----------------+  
  3. | @@global.tx_isolation | @@tx_isolation  |  
  4. +-----------------------+-----------------+  
  5. REPEATABLE-READ       | REPEATABLE-READ |  
  6. +-----------------------+-----------------+  
  7. 1 row in set (0.00 sec)  
更改会话级的隔离级别

 

[sql]
  
 
  1. Session 1:  
  2. mysql> set session tx_isolation='read-uncommitted';  
  3. Query OK, 0 rows affected (0.00 sec)  
  4. mysql> select @@global.tx_isolation,@@tx_isolation;  
  5. +-----------------------+------------------+  
  6. | @@global.tx_isolation | @@tx_isolation   |  
  7. +-----------------------+------------------+  
  8. REPEATABLE-READ       | READ-UNCOMMITTED |  
  9. +-----------------------+------------------+  
  10. 1 row in set (0.00 sec)  
  11.   
  12.   
  13. Session 2:  
  14. mysql> select @@global.tx_isolation, @@tx_isolation;  
  15. +-----------------------+-----------------+  
  16. | @@global.tx_isolation | @@tx_isolation  |  
  17. +-----------------------+-----------------+  
  18. REPEATABLE-READ       | REPEATABLE-READ |  
  19. +-----------------------+-----------------+  
  20. 1 row in set (0.00 sec)  
更改系统级的隔离级别

 

 

[sql]
  
 
  1. Session 1:  
  2. mysql> set global tx_isolation='read-uncommitted';  
  3. Query OK, 0 rows affected (0.00 sec)  
  4. mysql> select @@global.tx_isolation,@@tx_isolation;  
  5. +-----------------------+------------------+  
  6. | @@global.tx_isolation | @@tx_isolation   |  
  7. +-----------------------+------------------+  
  8. READ-UNCOMMITTED      | READ-UNCOMMITTED |  
  9. +-----------------------+------------------+  
  10. 1 row in set (0.00 sec)  
  11.   
  12. Session 2:  
  13. mysql> select @@global.tx_isolation, @@tx_isolation;  
  14. +-----------------------+-----------------+  
  15. | @@global.tx_isolation | @@tx_isolation  |  
  16. +-----------------------+-----------------+  
  17. READ-UNCOMMITTED      | REPEATABLE-READ |  
  18. +-----------------------+-----------------+  
  19. 1 row in set (0.00 sec)  

 

关闭SQL语句的自动提交

 

[sql]
  
 
  1. mysql> set autocommit=off;  
  2. Query OK, 0 rows affected (0.00 sec)  

 

查看SQL语句自动提交是否关闭

 

[plain]
  
 
  1. mysql> show variables like 'autocommit';  
  2. +---------------+-------+  
  3. | Variable_name | Value |  
  4. +---------------+-------+  
  5. | autocommit    | OFF   |  
  6. +---------------+-------+  
  7. 1 row in set (0.00 sec)  
建立实验表

 

 

 

[sql]
  
 
  1. mysql> create table tao (col1 tinyint unsigned, col2 varchar(20), primary key(col1));  
  2. Query OK, 0 rows affected (0.08 sec)  
  3.   
  4. mysql> show create table tao \G;  
  5. *************************** 1. row ***************************  
  6.        Table: tao  
  7. Create Table: CREATE TABLE `tao` (  
  8.   `col1` tinyint(3) unsigned NOT NULL DEFAULT '0',  
  9.   `col2` varchar(20) DEFAULT NULL,  
  10.   PRIMARY KEY (`col1`)  
  11. ) ENGINE=InnoDB DEFAULT CHARSET=utf8  
  12. 1 row in set (0.00 sec)  
演示脏读

 

 

更改隔离级别为Read Committed后,不存在脏读的问题。

 

[sql]
  
 
  1. mysql> set global tx_isolation='read-committed';  
  2. Query OK, 0 rows affected (0.00 sec)  
  3. mysql> set session tx_isolation='read-committed';  
  4. Query OK, 0 rows affected (0.00 sec)  
演示不可重复读

 

 

更改隔离级别为Repeatable Read后,不存在不可重复读的问题。

 

[sql]
  
 
  1. mysql> set global tx_isolation='repeatable-read';  
  2. Query OK, 0 rows affected (0.00 sec)  
  3.   
  4. mysql> set session tx_isolation='repeatable-read';  
  5. Query OK, 0 rows affected (0.00 sec)  
幻读

 

 

更改隔离级别为完全串行化 Serializable 后,不存在幻读的问题。

 

[sql]
  
 
  1. mysql> set global tx_isolation='serializable';  
  2. Query OK, 0 rows affected (0.00 sec)  
  3.   
  4. mysql> set session tx_isolation='serializable';  
  5. Query OK, 0 rows affected (0.00 sec)  
在这种情况下,只允许一个事务在执行,其它事务必须等待这个事务执行完后才能执行。没有并发,只是单纯的串行。
你可能感兴趣的文章
IIS负载均衡
查看>>
分布式事务,EventBus 解决方案:CAP【中文文档】
查看>>
Linux下的CPU性能瓶颈分析案例
查看>>
spring mvc入门
查看>>
2012在数据库技术会议上的讲话PPT打包
查看>>
【Android】 TextView设置个别字体样式
查看>>
python svn
查看>>
raise语句
查看>>
sequence2(高精度dp)
查看>>
如何向 Linux 内核上游提交 Patch ?
查看>>
Go编程笔记(7)
查看>>
Go语言int类型绑定方法
查看>>
pid控制的文章
查看>>
MySQL中EXPLAIN命令详解
查看>>
redis 单点部署
查看>>
Java中需要编码的场景
查看>>
PHP生成word的三种方式
查看>>
设计模式(九)——桥接模式
查看>>
xen 创建本地存储
查看>>
TCP三次握手/四次挥手 | NAT介绍 |OSI与TCP/IP模型
查看>>