http://dev.mysql.com/doc/refman/5.6/en/set-transaction.html#isolevel_repeatable-read
"同一事务中的所有一致读取都会读取快照 由第一次阅读建立。"
实际上我只想到第一次读取时读取的行的快照,但这让我感到困惑:
TRANSACTION 1首先启动,然后是2.最后一个" SELECT * FROM B的结果;"在T1中完全相同,就好像我没有同时执行T2一样(直到UPDATE和INSERT都出现了,尽管读写都在不同的表上)
SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ;
START TRANSACTION;
SELECT * FROM A WHERE a_id = 1;
SELECT SLEEP(8);
SELECT * FROM B;
COMMIT;
SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ;
START TRANSACTION;
UPDATE B SET b_name = 'UPDATE_6' WHERE b_id = 2;
INSERT INTO B (b_name) VALUES('NEW_5');
COMMIT;
# 1st query
a_id a_name
1 a_1
# 3rd query
b_id b_name
1 b_1
2 b_2
3 b_3
在一个可重复读取的交易中:
如果T1和T2中的数据以任何方式组合在一起,可能会发生,读者在第一步读取一些数据,在第三步中读取相关数据,现在可能不再相关,因为作者已经同时改变了T1和T2。 AFAIK可重复读取仅保证相同的读取返回相同的数据,但第二次读取与第一次读取不同。
我希望,你知道,我的意思,我担心,我得到某事。这个话题完全错了。
(一周前我在MySQL论坛上问了这个问题而没有答案:http://forums.mysql.com/read.php?20,629710,629710#msg-629710)
答案 0 :(得分:0)
快照适用于数据库中的所有表。 MySQL文档在此明确指出http://dev.mysql.com/doc/refman/5.6/en/innodb-consistent-read.html:
一致性读取意味着InnoDB使用多版本来呈现 在某个时间点查询数据库的快照。
和
假设您在默认的REPEATABLE READ隔离中运行 水平。发出一致读取时(即普通SELECT) 声明),InnoDB为您的交易提供了一个时间点 您的查询看到数据库。
和
数据库状态的快照适用于其中的SELECT语句 一个事务,不一定是DML语句。