赞
踩
本文是《MySQL是怎样运行的-从根儿上理解MySQL》的学习笔记,文中的图全部来自于这本书,强烈建议买一本看看,对MySQL理解会特别深入,非常感谢作者"小孩子4919"。
脏读
一个事务读取到了另一个未提交事务修改的数据,意味着发生了脏读.
不可重复读
如果一个事务修改了另一个未提交事务读取的数据,就意味着发生了不可重复读.
幻读
如果一个事务先根据某些搜索条件查询出一些记录,在该事务未提交时,另一个事务写入了一些符合哪些搜索条件的记录,就意味着发生了幻读.
mysql定义了4中隔离级别
隔离级别 | 脏读 | 不可重复读 | 幻读 |
---|---|---|---|
READ UNCOMMITTED(读未提交) | 可能 | 可能 | 可能 |
READ COMMITTED(读已提交) | 不可能 | 可能 | 可能 |
REPEATABLE READ(可重复读) | 不可能 | 不可能 | 可能 |
SERIALIZABLE(串行化) | 不可能 | 不可能 | 不可能 |
对于InnoDB存储引擎的表来说,它的聚簇索引记录中都包含以下两个必要的隐藏列
CREATE TABLE student(
sno int(10) NOT NULL AUTO_INCREMENT,
sname varchar(100),
age int(4),
PRIMARY KEY (`sno`)
));
INSERT INTO student VALUES(null, 's3', 12);
假设插入之后两个事务id分别为100和200的事务对这条记录进行UPDATE操作,操作流程如图21-3所示.
对于InnoDB存储引擎来说,可重复读和读已提交都是通过ReadView实现的,下面就来介绍ReadView,它包含以下四个方面的内容
事务隔离级别的核心问题是:版本链中那个版本对当前事务是可见的.有了ReadView就可以很方便判断,判断条件如下:
总结
如果
t
r
x
_
i
d
>
=
m
a
x
_
t
r
x
_
i
d
trx\_id>=max\_trx\_id
trx_id>=max_trx_id或者
t
r
x
_
i
d
>
m
i
n
_
t
r
x
_
i
d
且
t
r
x
_
i
d
<
=
m
a
x
_
t
r
x
_
i
d
trx\_id>min\_trx\_id 且 trx\_id<=max\_trx\_id
trx_id>min_trx_id且trx_id<=max_trx_id,则该版本对当前事务不可见.如果某个版本对当前事务不可见,那么沿着版本链往下找到可见的版本,如果找到最后一条版本链还是不可见,那么该记录对当前事务不可见.
读已提交和可重复读区别在于,读已提交在事务每次SELECT语句时都会生成ReadView,而可重复读只在第一次SELECT时生成,此后不再发生变化.
sno | name |
---|---|
1 | s1 |
2 | s2 |
3 | s3 |
8 | s4 |
如果对sno=8的记录加上间隙锁,那么当前事务在未提交前,其他事务无法插入sno列值处于区间 ( 3 , 8 ) (3,8) (3,8)的记录,这就是间隙锁.mysql的间隙锁是为了解决部分幻读问题.
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。