SQL标准定义了4种隔离级别,包括了一些具体规则,用来限定事务内外的哪些改变是可见的,哪些是不可见的。

低级别的隔离级一般支持更高的并发处理,并拥有更低的系统开销。

首先,我们使用 test 数据库,新建 tx 表,并且如图所示打开两个窗口来操作同一个数据库:


第1级别:Read Uncommitted(读取未提交内容)

(1)所有事务都可以看到其他未提交事务的执行结果
(2)本隔离级别很少用于实际应用,因为它的性能也不比其他级别好多少
(3)该级别引发的问题是——脏读(Dirty Read):读取到了未提交的数据

  1. #首先,修改隔离级别
    set tx_isolation='READ-UNCOMMITTED';
  2. select @@tx_isolation;
  3. +------------------+
  4. | @@tx_isolation |
  5. +------------------+
  6. | READ-UNCOMMITTED |
  7. +------------------+
  8.  
  9. #事务A:启动一个事务
  10. start transaction;
  11. select * from tx;
  12. +------+------+
  13. | id | num |
  14. +------+------+
  15. | 1 | 1 |
  16. | 2 | 2 |
  17. | 3 | 3 |
  18. +------+------+
  19.  
  20. #事务B:也启动一个事务(那么两个事务交叉了)
           在事务B中执行更新语句,且不提交
  21. start transaction;
  22. update tx set num=10 where id=1;
  23. select * from tx;
  24. +------+------+
  25. | id | num |
  26. +------+------+
  27. | 1 | 10 |
  28. | 2 | 2 |
  29. | 3 | 3 |
  30. +------+------+
  31.  
  32. #事务A:那么这时候事务A能看到这个更新了的数据吗?
  33. select * from tx;
  34. +------+------+
  35. | id | num |
  36. +------+------+
  37. | 1 | 10 |   --->可以看到!说明我们读到了事务B还没有提交的数据
  38. | 2 | 2 |
  39. | 3 | 3 |
  40. +------+------+
  41.  
  42. #事务B:事务B回滚,仍然未提交
  43. rollback;
  44. select * from tx;
  45. +------+------+
  46. | id | num |
  47. +------+------+
  48. | 1 | 1 |
  49. | 2 | 2 |
  50. | 3 | 3 |
  51. +------+------+
  52.  
  53. #事务A:在事务A里面看到的也是B没有提交的数据
  54. select * from tx;
  55. +------+------+
  56. | id | num |
  57. +------+------+
  58. | 1 | 1 |      --->脏读意味着我在这个事务中(A中),事务B虽然没有提交,但它任何一条数据变化,我都可以看到!
  59. | 2 | 2 |
  60. | 3 | 3 |
  61. +------+------+

第2级别:Read Committed(读取提交内容)

(1)这是大多数数据库系统的默认隔离级别(但不是MySQL默认的)
(2)它满足了隔离的简单定义:一个事务只能看见已经提交事务所做的改变
(3)这种隔离级别出现的问题是——不可重复读(Nonrepeatable Read):不可重复读意味着我们在同一个事务中执行完全相同的select语句时可能看到不一样的结果。
     |——>导致这种情况的原因可能有:(1)有一个交叉的事务有新的commit,导致了数据的改变;(2)一个数据库被多个实例操作时,同一事务的其他实例在该实例处理其间可能会有新的commit

  1. #首先修改隔离级别
    set tx_isolation='read-committed';
  2. select @@tx_isolation;
  3. +----------------+
  4. | @@tx_isolation |
  5. +----------------+
  6. | READ-COMMITTED |
  7. +----------------+
  8.  
  9. #事务A:启动一个事务
  10. start transaction;
  11. select * from tx;
  12. +------+------+
  13. | id | num |
  14. +------+------+
  15. | 1 | 1 |
  16. | 2 | 2 |
  17. | 3 | 3 |
  18. +------+------+
  19.  
  20. #事务B:也启动一个事务(那么两个事务交叉了)
           在这事务中更新数据,且未提交
  21. start transaction;
  22. update tx set num=10 where id=1;
  23. select * from tx;
  24. +------+------+
  25. | id | num |
  26. +------+------+
  27. | 1 | 10 |
  28. | 2 | 2 |
  29. | 3 | 3 |
  30. +------+------+
  31.  
  32. #事务A:这个时候我们在事务A中能看到数据的变化吗?
  33. select * from tx; --------------->
  34. +------+------+                |
  35. | id | num |                |
  36. +------+------+                |
  37. | 1 | 1 |--->并不能看到!  |
  38. | 2 | 2 |                |
  39. | 3 | 3 |                |
  40. +------+------+                |——>相同的select语句,结果却不一样
  41.                                |
  42. #事务B:如果提交了事务B呢?         |
  43. commit;                        |
  44.                                |
  45. #事务A:                         |
  46. select * from tx; --------------->
  47. +------+------+
  48. | id | num |
  49. +------+------+
  50. | 1 | 10 |--->因为事务B已经提交了,所以在A中我们看到了数据变化
  51. | 2 | 2 |
  52. | 3 | 3 |
  53. +------+------+

第3级别:Repeatable Read(可重读)

(1)这是MySQL的默认事务隔离级别
(2)它确保同一事务的多个实例在并发读取数据时,会看到同样的数据行
(3)此级别可能出现的问题——幻读(Phantom Read):当用户读取某一范围的数据行时,另一个事务又在该范围内插入了新行,当用户再读取该范围的数据行时,会发现有新的“幻影” 行
(4)InnoDB和Falcon存储引擎通过多版本并发控制(MVCC,Multiversion Concurrency Control)机制解决了该问题

  1. #首先,更改隔离级别
    set tx_isolation='repeatable-read';
  2. select @@tx_isolation;
  3. +-----------------+
  4. | @@tx_isolation |
  5. +-----------------+
  6. | REPEATABLE-READ |
  7. +-----------------+
  8.  
  9. #事务A:启动一个事务
  10. start transaction;
  11. select * from tx;
  12. +------+------+
  13. | id | num |
  14. +------+------+
  15. | 1 | 1 |
  16. | 2 | 2 |
  17. | 3 | 3 |
  18. +------+------+
  19.  
  20. #事务B:开启一个新事务(那么这两个事务交叉了)
           在事务B中更新数据,并提交
  21. start transaction;
  22. update tx set num=10 where id=1;
  23. select * from tx;
  24. +------+------+
  25. | id | num |
  26. +------+------+
  27. | 1 | 10 |
  28. | 2 | 2 |
  29. | 3 | 3 |
  30. +------+------+
  31. commit;
  32.  
  33. #事务A:这时候即使事务B已经提交了,但A能不能看到数据变化?
  34. select * from tx;
  35. +------+------+
  36. | id | num |
  37. +------+------+
  38. | 1 | 1 | --->还是看不到的!(这个级别2不一样,也说明级别3解决了不可重复读问题)
  39. | 2 | 2 |
  40. | 3 | 3 |
  41. +------+------+
  42.  
  43. #事务A:只有当事务A也提交了,它才能够看到数据变化
  44. commit;
  45. select * from tx;
  46. +------+------+
  47. | id | num |
  48. +------+------+
  49. | 1 | 10 |
  50. | 2 | 2 |
  51. | 3 | 3 |
  52. +------+------+

第4级别:Serializable(可串行化)

(1)这是最高的隔离级别
(2)它通过强制事务排序,使之不可能相互冲突,从而解决幻读问题。简言之,它是在每个读的数据行上加上共享锁。
(3)在这个级别,可能导致大量的超时现象和锁竞争

  1. #首先修改隔离界别
    set tx_isolation='serializable';
  2. select @@tx_isolation;
  3. +----------------+
  4. | @@tx_isolation |
  5. +----------------+
  6. | SERIALIZABLE |
  7. +----------------+
  8.  
  9. #事务A:开启一个新事务
  10. start transaction;
  11.  
  12. #事务B:在A没有commit之前,这个交叉事务是不能更改数据的
  13. start transaction;
  14. insert tx values('4','4');
  15. ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction
  16. update tx set num=10 where id=1;
  17. ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction

mysql-通过例子解释四种隔离级别的更多相关文章

  1. MySQL数据库中的四种隔离级别

    事务的隔离性比想象的要复杂,在 SQL 标准中定义了四种级别的隔离级别.通常而言,较低级别的隔离通常可以执行更高的并发,系统的开销也更低 READ UNCOMMITTED 该级别为未提交读.在该级别中 ...

  2. mysql四大特性与四种隔离级别

    四大特性 1:原子性.事务是一个不可分割的整体,事务开始的操作,要么全部执行,要么全部不执行. 2:隔离性.同一时间,只允许一个事务请求同一组数据.不同的事务彼此之间没有干扰. 3:一致性.事务开始前 ...

  3. MySQL系列之二四种隔离级别及加锁

    事务 1.定义:所有操作必须成功完成,否则在每个操作中所作的所有更改都会备撤销. 2.事务的ACID 原子性atomicity   一致性consistency   隔离性isolation   持续 ...

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

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

  5. 【转载】mysql 四种隔离级别分析

    sql标准中,有四种隔离级别,各个离级别都有各自的规则,隔离级别越低,允许并发越大,消耗的资源越少,但是越不安全,下面就mysql数据库来分别介绍一下(每个存储引擎实施的隔离级别会有稍微的不同)mys ...

  6. MySQL 四种隔离级别

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

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

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

  8. MySql四种隔离级别

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

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

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

随机推荐

  1. 模块打包机--webpack--基础使用

    什么是webpack? 作用有哪些?   WebPack可以看做是模块打包机:它做的事情是,分析你的项目结构,找到JavaScript模块以及其它的一些浏览器不能直接运行的拓展语言(Scss,Type ...

  2. tp volist需要便利两个数组时的处理办法

    你需要便利两个数组,并且需要使用key 和value的试的时候,volist是否先得有些捉鸡? 我们可以便利其中一个数组,而另一个利用数组的指针来操作 next($arr) 将数组指针下移 key($ ...

  3. 【codeforces 749D】Leaving Auction

    [题目链接]:http://codeforces.com/problemset/problem/749/D [题意] 有n个人在竞价; 按照时间的顺序给出n次竞价(可能有一些人没有参加竞价); 每次竞 ...

  4. 笔试中java的输入输出

    一,输入 import java.util.*; import java.io.*; public class Main { public static void main(String[] args ...

  5. echarts 柱状图和饼状图动态获取后台数据

    运用echarts来实现图表 1.首先下载echarts包  http://echarts.baidu.com/echarts2/doc/example.html,在这里我下载的是 2.将echart ...

  6. log4j.propertie配置具体解释

    1.log4j.rootCategory=INFO, stdout , R 此句为将等级为INFO的日志信息输出到stdout和R这两个目的地,stdout和R的定义在以下的代码,能够随意起名.等级可 ...

  7. servlet修改后无效,仍然还是修改之前的效果

    注意servlet的路径是否正确,默认是java resources文件夹中的src.当在webcontent->web-inf->classses->data中时,注意添加路径.否 ...

  8. iOS学习必须了解的七大手势

    文章只要你有一点点基础应该就可以看的懂,文章只为学习交流 #import "ViewController.h" @interface ViewController () @prop ...

  9. [jzoj 5926] [NOIP2018模拟10.25] naive 的图 解题报告(kruskal重构树+二维数点)

    题目链接: https://jzoj.net/senior/#main/show/5926 题目: 题解: 显然最小的最大路径在最小生成树上(最小生成树=最小瓶颈生成树) 于是我们建出kruskal重 ...

  10. xBIM 实战01 在浏览器中加载IFC模型文件

    系列目录    [已更新最新开发文章,点击查看详细]  一.创建Web项目 打开VS,新建Web项目,选择 .NET Framework 4.5  选择一个空的项目 新建完成后,项目结构如下: 二.添 ...