sql标准中,有四种隔离级别,各个离级别都有各自的规则,隔离级别越低,允许并发越大,消耗的资源越少,但是越不安全,下面就mysql数据库来分别介绍一下(每个存储引擎实施的隔离级别会有稍微的不同)
mysql 动态修改隔离级别的命令
SET [GLOBAL | SESSION] TRANSACTION ISOLATION LEVEL
{
READ UNCOMMITTED
| READ COMMITTED
| REPEATABLE READ
| SERIALIZABLE
}

1:READ UNCOMMITTED
在这种隔离级别中,事务能看到其他事务未提交的结果,像这种读到uncommitted的数据称为dirty read
如:
mysql--root@localhostnone) 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@localhostnone) 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 四种隔离级别分析的更多相关文章

  1. MySQL 四种隔离级别

    什么是事务 事务是应用程序中一系列严密的操作,所有操作必须成功完成,否则在每个操作中所作的所有更改都会被撤消.也就是事务具有原子性,一个事务中的一系列的操作要么全部成功,要么一个都不做. 事务的结束有 ...

  2. MySql四种隔离级别

    什么是事务 事务是应用程序中一系列严密的操作,所有操作必须成功完成,否则在每个操作中所作的所有更改都会被撤消.也就是事务具有原子性,一个事务中的一系列的操作要么全部成功,要么一个都不做. 事务的结束有 ...

  3. 面试问烂的 MySQL 四种隔离级别,看完吊打面试官!

    阅读本文大概需要 5.6 分钟. 来源:网络 什么是事务 事务是应用程序中一系列严密的操作,所有操作必须成功完成,否则在每个操作中所作的所有更改都会被撤消.也就是事务具有原子性,一个事务中的一系列的操 ...

  4. MySQL 四种隔离级别详解,看完吊打面试官

    转发链接:https://zhuanlan.zhihu.com/p/76743929 什么是事务 事务是应用程序中一系列严密的操作,所有操作必须成功完成,否则在每个操作中所作的所有更改都会被撤消.也就 ...

  5. MySQL四种隔离级别和MVCC

    事务在一个数据库中的地位尤为重要,尤其是高并发的场合.保证数据库操作的原子性和错误出现情况下的回滚,对数据的安全性和可靠性提供了保障.事务有四大原则,即ACID原则.网上关于这个问题的文章有很多,读者 ...

  6. MySQL面试题--常见的四种隔离级别

    什么是事务 事务是应用程序中一系列严密的操作,所有操作必须成功完成,否则在每个操作中所作的所有更改都会被撤消.也就是事务具有原子性,一个事务中的一系列的操作要么全部成功,要么一个都不做. 事务的结束有 ...

  7. SQL事务的四种隔离级别和MySQL多版本并发控制

      SQL标准定义了4类隔离级别,包括了一些具体规则,用来限定事务内外的那些改变时可见的,那些是不可见的.低级别的隔离级一般支持更高的并发处理,并拥有更低的系统开销. ReadUncommitted( ...

  8. 数据库操作事物的四大特性以及MySQL数据库的四种隔离级别

    1 .事物操作数据库的四大特性(ACID) 1.原子性 (Atomicity) 原子性:就是事物的所包含的所有操作,要么全部成功,要么全部失败回滚. 2.一致性 (Consistency) 一致性:简 ...

  9. 简单理解:数据库的一致性与四种隔离级别(+MySQL实现)

    并行数据库存在着几种常见不一致问题: 1.更新丢失:两个并发的写进程同时修改某内容,一个没修改完提交之后另一个又提交,导致其覆盖了第一个提交的写进程内容. 2.脏读:一个操作读到了另外一个操作没有提交 ...

随机推荐

  1. Linux_内存查询

    查询磁盘使用情况: [root@css-management ~]# df -hl 文件系统 容量 已用 可用 已用% 挂载点 Filesystem Size Used Avail Use% Moun ...

  2. jQuery的deferred对象详解(一)

    最近一段时间,都在研究jquery里面的$.Deffered对象,几天都搞不明白,其中源码的运行机制,网上查找了相关的资料,<jQuery的deferred对象详解>阮一峰老师的文章,里面 ...

  3. hdu 2473 并查集

    思路:每次合并时,都是给一个虚拟的根. #include<map> #include<Set> #include<cmath> #include<queue& ...

  4. ORACLE之表

    本文章中的表在以后的例子中会用到. 首先有t_fn_person和t_fn_dept表. ) primary key not null, person_code ) not null, person_ ...

  5. Charles 应用

    1.首先设置本机host文件,将需要测试的域名指向127.0.0.1:(测试域名没有代理,才会这么操作): 2.打开Charles,设置Proxy选项,取消“Windows Proxy”选中状态: 3 ...

  6. 继承Animation

    package cativity.cyq.alphaanimal; import android.view.animation.Animation; import android.view.anima ...

  7. Android文字转语音

    虽然视觉上的反馈通常是给用户提供信息最快的方式,但这要求用户把注意力设备上.当用户不能查看设备时,则需要一些其他通信的方法.Android提供了强大的文字转语音Text-to-Speech,TTS A ...

  8. Android高级音频应用

    说到音频应用,首先想到的就是音乐播放器.有些播放器可以播放流媒体,有些可以播放本地音乐文件.随着Android平台的演变,需要更多高级的音频API.好在谷歌新增了这方面的API,支持低延迟的音频流媒体 ...

  9. Part 13 Cast and Convert functions in SQL Server

    Part 28 Cast and Convert functions in SQL Server

  10. 在Windows Server 2012 中安装 .NET 3.5 Framework,PowerShell 安装.NET FRAMEWORK

    问题 如今,仍然有许多程序和应用需要依靠.NET 3.5 framework 来运行.在Windows Server 2012中,微软提供了.NET 3.5 和.NET 4.5的安装选项以为你的应用程 ...