【转载】mysql 四种隔离级别分析
sql标准中,有四种隔离级别,各个离级别都有各自的规则,隔离级别越低,允许并发越大,消耗的资源越少,但是越不安全,下面就mysql数据库来分别介绍一下(每个存储引擎实施的隔离级别会有稍微的不同)
mysql 动态修改隔离级别的命令
SET [GLOBAL | SESSION] TRANSACTION ISOLATION LEVEL
{
READ UNCOMMITTED
| READ COMMITTED
| REPEATABLE READ
| SERIALIZABLE
}
1:READ UNCOMMITTED
在这种隔离级别中,事务能看到其他事务未提交的结果,像这种读到uncommitted的数据称为dirty read
如:
mysql--root@localhost
none) 06:47:49>>show variables like 'tx%';
+---------------+------------------+
| Variable_name | Value |
+---------------+------------------+
| tx_isolation | READ-UNCOMMITTED |
+---------------+------------------+
1 row in set (0.00 sec)
session A session B
start TRANSACTION; start TRANSACTION;
select * from t4 where i>45; select * from t4 where i>45;
+------+------+ +------+------+
| i | j | | i | j |
+------+------+ +------+------+
| 55 | 2 | | 55 | 2 |
| 46 | 2 | | 46 | 2 |
| 47 | 3 | | 47 | 3 |
| 48 | 2 | | 48 | 2 |
insert into t4 values (49,4),(49,4);
Query OK, 2 rows affected (0.00 sec)
Records: 2 Duplicates: 0 Warnings: 0
select * from t4 where i>45;
+------+------+
| i | j |
+------+------+
| 55 | 2 |
| 46 | 2 |
| 47 | 3 |
| 48 | 2 |
| 49 | 4 |
| 49 | 4 |
+------+------+
6 rows in set (0.00 sec)
select * from t4 where i>45;
+------+------+
| i | j |
+------+------+
| 55 | 2 |
| 46 | 2 |
| 47 | 3 |
| 48 | 2 |
| 49 | 4 |
| 49 | 4 |
+------+------+
6 rows in set (0.00 sec)
commit;
很明显,在session A 中,未提交事务修改的数据,在session B中也能显示,这样就是未提交读隔离级别
2:READ COMMITTED
在这种隔离级别下,事务只能看到其他事务commit的数据,但是在这种级别下,会出现所谓的”不可重复读“问题,即查询前后,得到的数据不一样
如:
mysql--root@localhost
none) 07:02:03>>show variables like 'tx%';
+---------------+----------------+
| Variable_name | Value |
+---------------+----------------+
| tx_isolation | READ-COMMITTED |
+---------------+----------------+
1 row in set (0.00 sec)
session A session B
select * from t4 where i=55; select * from t4 where i=55;
+------+------+ +------+------+
| i | j | | i | j |
+------+------+ +------+------+
| 55 | 2 | | 55 | 2 |
+------+------+ +------+------+
1 row in set (0.00 sec) 1 row in set (0.00 sec)
update t4 set j=4 where i=55;
Query OK, 1 row affected (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 0
select * from t4 where i=55; select * from t4 where i=55;
+------+------+ +------+------+
| i | j | | i | j |
+------+------+ +------+------+
| 55 | 4 | | 55 | 2 |
+------+------+ +------+------+
1 row in set (0.00 sec) 1 row in set (0.00 sec)
在session B中是看不到未提交事务修改的数据
commit;
select * from t4 where i=55; select * from t4 where i=55;
+------+------+ +------+------+
| i | j | | i | j |
+------+------+ +------+------+
| 55 | 4 | | 55 | 4 |
+------+------+ +------+------+
1 row in set (0.00 sec) 1 row in set (0.00 sec)
当事务提交后,session B 就能看到修改的数据,这样也就发生了上述所谓的“不可重复读”问题
3:REPEATABLE READ
理论上讲,该级别解决了READ COMMITTED级别的“不可重复读”问题,但是还是会出现所谓的“幽灵读”问题,何谓“幽灵读”,当你通过一区间查询时候,其他事务在这期间插入一条数据并提交,这样你在次查询时,会发现突然多出一行,这就是所谓的“幽灵行”,但是对于innodb跟
falcon,他们通过MVCC解决了这个问题,故对于innodb 跟 falcon,实现了名副其实的可重复读
如:
show variables like 'tx%';
+---------------+-----------------+
| Variable_name | Value |
+---------------+-----------------+
| tx_isolation | REPEATABLE-READ |
+---------------+-----------------+
1 row in set (0.00 sec)
1)
session A session B
start TRANSACTION; start TRANSACTION;
select * from t4 where i=55; select * from t4 where i=55;
+------+------+ +------+------+
| i | j | | i | j |
+------+------+ +------+------+
| 55 | 4 | | 55 | 4 |
+------+------+ +------+------+
1 row in set (0.00 sec) 1 row in set (0.00 sec)
update t4 set j=6 where i=55;
commit;
select * from t4 where i=55; select * from t4 where i=55;
+------+------+ +------+------+
| i | j | | i | j |
+------+------+ +------+------+
| 55 | 6 | | 55 | 4 |
+------+------+ +------+------+
1 row in set (0.00 sec) 1 row in set (0.00 sec)
像这次就没有出现上一级别中不可能重复读问题
2)
session A session B
start TRANSACTION; start TRANSACTION;
select * from t4 where i>47 and i<55; select * from t4 where i>47 and i<55;
+------+------+ +------+------+
| i | j | | i | j |
+------+------+ +------+------+
| 48 | 2 | | 48 | 2 |
+------+------+ +------+------+
1 row in set (0.00 sec) 1 row in set (0.00 sec)
insert into t4 values (50,1);
commit;
select * from t4 where i>47 and i<55; select * from t4 where i>47 and i<55;
+------+------+ +------+------+
| i | j | | i | j |
+------+------+ +------+------+
| 48 | 2 | | 48 | 2 |
| 50 | 1 | +------+------+
+------+------+ 1 row in set (0.00 sec)
2 rows in set (0.00 sec)
commit;
select * from t4 where i>47 and i<55;
+------+------+
| i | j |
+------+------+
| 48 | 2 |
| 50 | 1 |
+------+------+
2 rows in set (0.00 sec)
像这样,没有出现幽灵读问题,就是真正的可持续读了,
4:SERIALIZABLE
最高级别,这一级别是强制事务顺序执行,这样就解决了以上可持续读的问题,但是会出现大量的锁等待与死锁问题
1)
session A SESSION B
start TRANSACTION; start TRANSACTION;
insert into t4 values (52,4);
select * from t4 where i>48 and i<55;
等待中。。。。
commit
+------+------+
| i | j |
+------+------+
| 50 | 1 |
| 51 | 4 |
| 52 | 4 |
+------+------+
3 rows in set (6.05 se
2)
session A SESSION B
start TRANSACTION; start TRANSACTION;
select * from t4 where i>50 and i<55; select * from t4 where i>48 and i<55;
+------+------+ +------+------+
| i | j | | i | j |
+------+------+ +------+------+
| 51 | 4 | | 50 | 1 |
| 52 | 4 | | 51 | 4 |
+------+------+ | 52 | 4 |
2 rows in set (0.00 sec) +------+------+
3 rows in set (0.00 sec)
insert into t4 values (53,4);
等待中 如执行insert 则出现死锁,
session B ERROR 1213 (40001): Deadlock found when trying to get lock; try restarting transaction
如 执行commit; session A 中insert 执行
这就是在innodb下,四种隔离级别的具体分析了。很明显,根据自己的需要选择何时的隔离级别,对于提升系统性能也有莫大的帮助
转自:mysql中四种隔离级别的具体分析
http://bbs.linuxtone.org/thread-4781-1-1.html
【转载】mysql 四种隔离级别分析的更多相关文章
- MySQL 四种隔离级别
什么是事务 事务是应用程序中一系列严密的操作,所有操作必须成功完成,否则在每个操作中所作的所有更改都会被撤消.也就是事务具有原子性,一个事务中的一系列的操作要么全部成功,要么一个都不做. 事务的结束有 ...
- MySql四种隔离级别
什么是事务 事务是应用程序中一系列严密的操作,所有操作必须成功完成,否则在每个操作中所作的所有更改都会被撤消.也就是事务具有原子性,一个事务中的一系列的操作要么全部成功,要么一个都不做. 事务的结束有 ...
- 面试问烂的 MySQL 四种隔离级别,看完吊打面试官!
阅读本文大概需要 5.6 分钟. 来源:网络 什么是事务 事务是应用程序中一系列严密的操作,所有操作必须成功完成,否则在每个操作中所作的所有更改都会被撤消.也就是事务具有原子性,一个事务中的一系列的操 ...
- MySQL 四种隔离级别详解,看完吊打面试官
转发链接:https://zhuanlan.zhihu.com/p/76743929 什么是事务 事务是应用程序中一系列严密的操作,所有操作必须成功完成,否则在每个操作中所作的所有更改都会被撤消.也就 ...
- MySQL四种隔离级别和MVCC
事务在一个数据库中的地位尤为重要,尤其是高并发的场合.保证数据库操作的原子性和错误出现情况下的回滚,对数据的安全性和可靠性提供了保障.事务有四大原则,即ACID原则.网上关于这个问题的文章有很多,读者 ...
- MySQL面试题--常见的四种隔离级别
什么是事务 事务是应用程序中一系列严密的操作,所有操作必须成功完成,否则在每个操作中所作的所有更改都会被撤消.也就是事务具有原子性,一个事务中的一系列的操作要么全部成功,要么一个都不做. 事务的结束有 ...
- SQL事务的四种隔离级别和MySQL多版本并发控制
SQL标准定义了4类隔离级别,包括了一些具体规则,用来限定事务内外的那些改变时可见的,那些是不可见的.低级别的隔离级一般支持更高的并发处理,并拥有更低的系统开销. ReadUncommitted( ...
- 数据库操作事物的四大特性以及MySQL数据库的四种隔离级别
1 .事物操作数据库的四大特性(ACID) 1.原子性 (Atomicity) 原子性:就是事物的所包含的所有操作,要么全部成功,要么全部失败回滚. 2.一致性 (Consistency) 一致性:简 ...
- 简单理解:数据库的一致性与四种隔离级别(+MySQL实现)
并行数据库存在着几种常见不一致问题: 1.更新丢失:两个并发的写进程同时修改某内容,一个没修改完提交之后另一个又提交,导致其覆盖了第一个提交的写进程内容. 2.脏读:一个操作读到了另外一个操作没有提交 ...
随机推荐
- 怒刷DP之 HDU 1114
Piggy-Bank Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u Submit S ...
- 转:基于TLS1.3的微信安全通信协议mmtls介绍
转自: https://mp.weixin.qq.com/s?__biz=MzAwNDY1ODY2OQ==&mid=2649286266&idx=1&sn=f5d049033e ...
- SharePoint 2010 "客户端不支持使用windows资源管理器打开此列表" 解决方法
SharePoint 2010 在“库”--“库工具”,有一个“使用资源管理器打开”的按钮,点上去报“客户端不支持使用windows资源管理器打开此列表”.如图: 解决方案:在“开始”--“管理工具” ...
- CefSharp 发布后在客户机上报找不到dll的问题
两个因素:一是与项目平台属性的选择要一致二是需要安装CefSharp对应的的VC++可发行组件包(用包管理器引用了此DLL后,会有一个readme.txt,上面详细介绍了CefSharp所需要的环境要 ...
- .net导出Word的一种方法
由于ActiveX控件只支持IE(好像FF可以通过安装插件支持),所以js导出word的方式就比较局限 可是如果当页面经过js修改以后,.net是无法获取到的,所以要通过js获取到最新的html并传给 ...
- 三.CSS层叠机制
概述 层叠就是对样式的层叠.是某种样式在样式表中逐层叠加的过程.让浏览器对某个标签特定属性值的多个来源,最终确定使用那个值.层叠是整个CSS的核心机制. HTML文档样式的来源 1.浏览器默认样式,每 ...
- 关于GrideView Item点击后出现错乱重叠的情况
我在一个搜索页做了一个筛选信息的功能 大概思路如下:在根布局中用Include 引入一个筛选框(如图), 然后把边距设置为 android:layout_marginBottom="-250 ...
- ListViewDemo
ListView Layout示例:MainActivity.java中定义待显示的数据countryArray, 在activity_main中定义ListView,activity_listvie ...
- MarkFan的程序员客栈
历史上的今天:2013-12-27 跨平台移动开发 App-Framework DEMO 演示
- DateDiff函数 asp运算时间
DateDiff DateDiff函数 返回 返回 Variant (Long) 的值,表示两个指定日期间的时间间隔数目. 语法 DateDiff(interval, date1, date2[, f ...