56,687
社区成员
发帖
与我相关
我的任务
分享
-- 我对红色字体做个实验:
CREATE TABLE xxx (
id varchar(20) default NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
-- 表内容
+------+
| id |
+------+
| 1 | -- 这里隐藏了行的事务版本号,这里我例如设置为 10
| 2 | -- 这里隐藏了行的事务版本号,这里我例如设置为 11
+------+
-- 数据操作
+---------------------------------+-------------------------------------+
| session 1 | session |
+----------------------------- ---+-------------------------------------+
| | |
| start transaction 我假设这个事务| |
| 的版本号为 12 | |
+---------------------------------+-------------------------------------+
| | |
| | start transaction 我假设这个事务为|
| | 版本号为 13 |
+---------------------------------+-------------------------------------+ +------+
| | | | id |
| | select * from xxx | session 2的结果==> +------+
| | -- 查处所有小于等于13版本号的行 | | 1 |
| | | +------+
| | | | 2 |
| | | +------+
| | |
+---------------------------------+-------------------------------------+
| | |
| insert into xxx values('3') | |
| -- 输入一个版本号为 12的行 | |
+---------------------------------+-------------------------------------+
| | |
| commit; | |
| | |
+---------------------------------+-------------------------------------+
| | select * from xxx |
| | | +------+
| | 主要问题在这: | | id |
| | session 1 插入了一个版本号为 12的的 | session 2的结果 : +------+
| | 行,引用引言的红色字体部分可以得到, | | 1 |
| | session 2 的事务版本号为 13是大于12 | +------+
| | 的,这时,因该可以到的 id = 3的值。 | | 2 |
| | 但为什么却没有得到呢? | +------+
+---------------------------------+-------------------------------------+
↑
|
|
问题在这
mysql> SELECT @@TX_ISOLATION;
+-----------------+
| @@TX_ISOLATION |
+-----------------+
| REPEATABLE-READ |
+-----------------+
1 row in set (0.00 sec)
mysql>