事务隔离的需要和范围 - MySQL

need and scope of transaction isolation - MySQL

http://dev.mysql.com/doc/refman/5.6/en/set-transaction.html#isolevel_repeatable-read

"All consistent reads within the same transaction read the snapshot established by the first read."

  1. 这个快照包含什么?只有第一次读取所读取的行的快照,完整的 table 甚至完整的数据库?

实际上我以为只是第一次读取所读取的行的快照,但这让我感到困惑:

TRANSACTION 1 首先开始,然后是 2。T1 中最后一个 "SELECT * FROM B;" 的结果与我没有同时执行 T2 完全相同(UPDATE 和 INSERT 都没有出现,而且,尽管读写在不同的 tables)

交易 1:

SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ;

START TRANSACTION;

SELECT * FROM A WHERE a_id = 1;
SELECT SLEEP(8);
SELECT * FROM B;

COMMIT;

交易 2

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;

交易 1 的输出

# 1st query
a_id  a_name
1     a_1

# 3rd query
b_id b_name
1    b_1
2    b_2
3    b_3 

  1. 在我的网络应用程序中,PHP 脚本从 MySQL 数据库 (InnoDB) 中的文件导入数据。应用程序确保同时只有这 1 个写入过程。然而,可能还有多个并发的 readers。 现在我想知道,我是否应该,如果是,我该如何防止以下情况:

一次重复table-读取交易:

如果 T1 和 T2 中的数据以任何方式属于一起,则 reader 可能会在第一步读取一些数据,在第三步读取相关数据,现在可能不相关不再,因为作者同时更改了 T1 和 T2。 AFAIK repeatable-只读保证,相同的读取return相同的数据,但第二次读取与第一次读取不同。

我希望,你知道,我的意思,我害怕,我得到了某事。这个话题完全错了。

(一周前我在 MySQL 论坛上问了这个问题没有答案:http://forums.mysql.com/read.php?20,629710,629710#msg-629710

快照适用于数据库中的所有表。 MySQL 文档指出这里明确多次 http://dev.mysql.com/doc/refman/5.6/en/innodb-consistent-read.html:

A consistent read means that InnoDB uses multi-versioning to present to a query a snapshot of the database at a point in time.

Suppose that you are running in the default REPEATABLE READ isolation level. When you issue a consistent read (that is, an ordinary SELECT statement), InnoDB gives your transaction a timepoint according to which your query sees the database.

The snapshot of the database state applies to SELECT statements within a transaction, not necessarily to DML statements.