比如说 事务 A select * from tb1
里面有三条数据
然后开启一个事务 B
select * from tb1 里面也是三条
然后事务 A 插入一条并提交
事务 B 里面看到的还是三条
但是根据 mysql 版本控制,每行记录都有一个时间戳是事务的 id,新的事务 id 比老的事务 id 要大,事务 select 找到的行是创建时间比当前事务 id 要小的或者等于的行,但是上面的例子是事务 B 的 id 肯定比事务 A 要大,但是提交了依然看不到这是为什么?
1
kuko126 2018-10-24 12:01:22 +08:00 1
看你事务隔离级别,RR 下 B 看不到 A 的插入是正常的
|
2
lsongiu 2018-10-24 13:29:51 +08:00
mysql 默认隔离级别是可重复读,这不就是可重复读吗
|
7
Codingless 2018-10-24 14:17:45 +08:00
可见性的判断不是通过比较行记录事务 ID 和当前事务 ID 的实现的,是通过比较行记录对应 MVCC 版本链上某个节点的事务 ID 和当前查询对应的 ReadView 中若干个值(具体的比较规则代码里很清楚)实现的,具体可以了解一下 MVCC 和 ReadView 实现相关的内容。
|
8
zjsxwc 2018-10-24 14:33:07 +08:00
正常,Mysql 默认事务隔离级别 Repeatable Read 是会幻读的,想要不幻读需要开 Serializable 级别隔离
|
10
lsongiu 2018-10-24 15:00:47 +08:00
A ->开始 -> 修改 -> 提交
b ->开始 ->第一次查询 ->第二次查询 。这时候查出出来的都是修改过的 A ->开始 -> 修改 -> 提交 b ->开始 ->第一次查询 ->第二次查询 。这时候查出出来的都是修改前的 |
11
lsongiu 2018-10-24 15:01:11 +08:00
。。。这万一还自动去空格啊。。白写了
|
12
jojojo 2018-10-24 15:01:49 +08:00
我的理解,判断的不是事务 ID,而是系统版本号。每个行都有一个字段存系统版本号,版本号可能是时间戳,所以 a insert 操作的话,修改行版本号(时间戳)> b 的事务 id,所以对 b 不可见
|