MySQL InnoDB中的四种隔离级别
来源:互联网 发布:游戏开发编程语言 编辑:程序博客网 时间:2024/06/05 14:39
MySQL InnoDB中实现了四种隔离级别
-read uncommitted 应用可以读取到其他应用未提交的数据
-read committed 应用只能读取其他应用已经提交的数据
-repeatable read 应用保证同一事务中,每次读取的数据都是一样的
-serializable 强制序列化读写操作,即不允许读写操作同时进行
文章主要使用例子来说明四种隔离级别,假设有以下表的定义和数据:
mysql> create table test1(id int primary key, year int);
-read uncommitted 应用可以读取到其他应用未提交的数据
-read committed 应用只能读取其他应用已经提交的数据
-repeatable read 应用保证同一事务中,每次读取的数据都是一样的
-serializable 强制序列化读写操作,即不允许读写操作同时进行
文章主要使用例子来说明四种隔离级别,假设有以下表的定义和数据:
mysql> create table test1(id int primary key, year int);
mysql> insert into test1 values(100,2000),(200,2010),(14,2007),(4, 2008);
1. read uncommitted
Session 1:mysql> set session transaction isolation level read uncommitted;mysql> select @@tx_isolation;+------------------+| @@tx_isolation |+------------------+| READ-UNCOMMITTED |+------------------+1 row in set (0.00 sec)mysql> start transaction;mysql> select * from test1 where id=14;+----+------+| id | year |+----+------+| 14 | 2007 |+----+------+1 row in set (0.04 sec)Session 2:mysql> set session transaction isolation level read uncommitted;mysql> start transaction;mysql> update test1 set year = 2088 where id=14;Session 1:mysql> select * from test1 where id=14;+----+------+| id | year |+----+------+| 14 | 2088 |+----+------+1 row in set (0.00 sec)
示例图如下:
2. Read Committed
Session 1:mysql> set session transaction isolation level read committed;mysql> select @@tx_isolation;+----------------+| @@tx_isolation |+----------------+| READ-COMMITTED |+----------------+1 row in set (0.00 sec)mysql> start transaction;mysql> select * from test1 where id=14;+----+------+| id | year |+----+------+| 14 | 2007 |+----+------+1 row in set (0.04 sec)Session 2:mysql> set session transaction isolation level read committed;mysql> start transaction;mysql> update test1 set year = 2088 where id=14;Session 1:mysql> select * from test1 where id=14;+----+------+| id | year |+----+------+| 14 | 2007 |+----+------+1 row in set (0.00 sec)Session 2:mysql> commit;Session 1:mysql> select * from test1 where id=14;+----+------+| id | year |+----+------+| 14 | 2088 |+----+------+1 row in set (0.00 sec)示意图如下:
对于locking reads(SELECT ... FOR UPDATE 或者 SELECT ... LOCK IN SHARE MODE)、UPDATE和DELETE而言,在这种隔离级别下,InnoDB只锁index records,不锁gap。Gap locking 只用来做 foreign-key 约束检查和duplicate-key检查。因为不锁gap,不能防止幻像读。
另外,对于UPDATE或者DELETE而言,InnoDB只锁符合条件的记录,对于不符合条件的记录,在完成where条件的评估之后,就会把锁释放掉。(这一点和Repeatable Read不同,在RR隔离级别下,如果不走索引,那么会把所有的record和gap都加上锁)
3. Repeatable Read:
Session 1:mysql> set session transaction isolation level repeatable read;mysql> select @@tx_isolation;+-----------------+| @@tx_isolation |+-----------------+| REPEATABLE-READ |+-----------------+1 row in set (0.00 sec)mysql> start transaction;mysql> select * from test1 where id=14;+----+------+| id | year |+----+------+| 14 | 2007 |+----+------+1 row in set (0.04 sec)Session 2:mysql> set session transaction isolation level repeatable read;mysql> start transaction;mysql> update test1 set year = 2088 where id=14;Session 1:mysql> select * from test1 where id=14;+----+------+| id | year |+----+------+| 14 | 2007 |+----+------+1 row in set (0.00 sec)Session 2:mysql> commit;Session 1:mysql> select * from test1 where id=14;+----+------+| id | year |+----+------+| 14 | 2007 |+----+------+1 row in set (0.00 sec)mysql> commit;mysql> select * from test1 where id=14;+----+------+| id | year |+----+------+| 14 | 2088 |+----+------+1 row in set (0.00 sec)
示意图如下:
RR这种情况下的Lock Read加锁情况如下:
A. 如果是unique index上的 unique search condition,只锁那一条记录,不加gap锁。
B. 其他情况下,都需要加gap锁。
4. serializable
Session 1:mysql> set session transaction isolation level serializable;mysql> select @@tx_isolation;+----------------+| @@tx_isolation |+----------------+| SERIALIZABLE |+----------------+1 row in set (0.00 sec)mysql> start transaction;mysql> select * from test1 where id=14;+----+------+| id | year |+----+------+| 14 | 2007 |+----+------+1 row in set (0.04 sec)Session 2:mysql> set session transaction isolation level serializable;mysql> start transaction;mysql> update test1 set year = 2088 where id=14;ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction
示意图如下:
https://dev.mysql.com/doc/refman/5.7/en/innodb-transaction-isolation-levels.html
阅读全文
0 0
- MySQL InnoDB中的四种隔离级别
- MySQL InnoDB 四种事务隔离级别
- MySQL InnoDB隔离级别
- mySql四种隔离级别
- mysql-innodb事务隔离级别
- MySql Innodb 事务隔离级别
- mysql 四种隔离级别分析
- mysql 四种事务隔离级别汇总
- Mysql的四种隔离级别
- Mysql的四种隔离级别
- Mysql的四种事物隔离级别
- mysql的四种隔离级别
- MySQL四种事务隔离级别详解
- Mysql事物四种隔离级别
- mysql事物四种隔离级别详解
- MySQL中的隔离级别
- SQL标准中的四种隔离级别
- 事务中的四种隔离级别
- xfce的panel图标置右操作
- mysql5.5 win7 修改 登陆密码
- 移动硬盘无法打开,提示需格式化
- Java中的可变参数
- bzoj3594: [Scoi2014]方伯伯的玉米田
- MySQL InnoDB中的四种隔离级别
- HDu 6216 && 2017 ACM/ICPC Asia Regional Qingdao Online 1011
- Viewpager+Fragment实现项目主布局
- linux 虚拟机 配置静态IP地址
- 求s=a+aa+aaa+aaaa+aa...a的值
- eclipse下maven配置oracle14包
- fedora14 yum 安装源的地址配置到官方归档地址
- 9月17
- Java300StudyNote(1)-反射机制-提高反射效率