IT人生

  • 首页
  • 归档
  • kafka
  • Java
  • Spring
  • Golang
  • SQL
  • Spark
  • ElasticSearch
  • 关于

  • 搜索
Phoenix HBase Kudu ElasticSearch Spring 数据结构 操作系统 Kettle Azkaban Sqoop Hive Yarn Redis Mybatis Impala Cloudera 大数据 HDFS mycat shell Linux 架构 并发 mysql sql golang java 工具 spark kafka 人生

数据库事物隔离四种级别详解

发表于 2016-10-10 | 分类于 数据库 | 0 | 阅读次数 2396

数据库事物隔离级别有四种,按照隔离性,由低到高依次是:

  1. Read Uncommitted
  2. Read Committed
  3. Repeatable Read
  4. Serializable

按照并发性则顺序相反。

√: 可能出现 ×: 不会出现

||脏读|不可重复读 |幻读| |-|-|-|-| |Read uncommitted(未提交读) |√|√|√| |Read committed(已提交读) |×|√|√| |Repeatable read(可重复读) |×|×|√| |Serializable(可串行化) |×|×|×|

1.Read uncommitted

读未提交,即在SQL查询中,读取了未提交的数据。在mysql中,默认的事物级别是Repeatable read;默认自动提交模式是打开的,现做如下修改如下所示,

(1)关闭自动提交

mysql> show variables like 'autocommit';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| autocommit    | ON    |
+---------------+-------+
1 row in set (0.00 sec)

mysql> set autocommit = 0;
Query OK, 0 rows affected (0.00 sec)

mysql> show variables like 'autocommit';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| autocommit    | OFF   |
+---------------+-------+
1 row in set (0.01 sec)

(2)修改事物级别为Read uncommitted

mysql> show variables like 'tx_isolation';
+---------------+-----------------+
| Variable_name | Value           |
+---------------+-----------------+
| tx_isolation  | REPEATABLE-READ |
+---------------+-----------------+
1 row in set (0.00 sec)
  mysql> SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
  Query OK, 0 rows affected (0.00 sec)

  mysql> SET GLOBAL TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
  Query OK, 0 rows affected (0.00 sec)

当前打开了两个session,在第一个,往表test中插入了一行数据,但是还没有提交,此时通过第二个session可以查询到该条数据。 mysql-isolation-1

且当第一个session中的事物rollback之后,第二个session又查询不到新插入的数据‘3’ mysql-isonlation-2

2.Read Committed

读提交,修改事物几倍为Read Committed

mysql> SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED;
Query OK, 0 rows affected (0.00 sec)

mysql> SET GLOBAL TRANSACTION ISOLATION LEVEL READ COMMITTED;
Query OK, 0 rows affected (0.00 sec)

此时,在session0中插入了一条数据且未commit,在session1中无法查询到 mysql-isolation-3

等session0在commit之后,session1可以正常的查询到数据 mysql-isolation-4

3.Repeatable read

可重复读,此时修改事物级别为可重复读

mysql> SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ;
Query OK, 0 rows affected (0.00 sec)

mysql> SET GLOBAL TRANSACTION ISOLATION LEVEL REPEATABLE READ;
Query OK, 0 rows affected (0.00 sec)

此时,test表中存在两笔数据:2和4,如下所示

mysql> select * from test where col1 <'5';
+------+
| col1 |
+------+
| 2    |
| 4    |
+------+
2 rows in set (0.00 sec)

此时步骤如下: 1.在session0中begin一个事物; 2.在session1中插入一条数据(5),并commit; 3.在session0中查询,发现查询不到在session1中插入的数据 mysql-isolation-5

接下来,再做如下操作: 1.在session0中commit; 2.在session0中再做查询操作,发现之前在session1中insert的5又可以查询到 mysql-isolation-6

4.Serializable

可串行话,是最高的隔离级别,即在读取的每一行数据上会加锁,事物顺序执行。所以会出现锁超时等问题,在实际业务中很少使用。

  • 本文作者: Randy
  • 本文链接: http://www.itrensheng.com/archives/1572449419792
  • 版权声明: 本博客所有文章除特别声明外,均采用CC BY-NC-SA 3.0 许可协议。转载请注明出处!
# Phoenix # HBase # Kudu # ElasticSearch # Spring # 数据结构 # 操作系统 # Kettle # Azkaban # Sqoop # Hive # Yarn # Redis # Mybatis # Impala # Cloudera # 大数据 # HDFS # mycat # shell # Linux # 架构 # 并发 # mysql # sql # golang # java # 工具 # spark # kafka # 人生
Spring依赖注入和控制反转
基于Centos7源码安装mysql-5.7.16-linux-glibc2.5-x86_64.tar.g
  • 文章目录
  • 站点概览
Randy

Randy

技术可以暂时落后,但任何时候都要有上进的信念

80 日志
27 分类
31 标签
RSS
Github E-mail
Creative Commons
© 2021 备案号:沪ICP备19020689号-1
Randy的个人网站