事务隔离的需要和范围 - 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."
- 这个快照包含什么?只有第一次读取所读取的行的快照,完整的 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
- 在我的网络应用程序中,PHP 脚本从 MySQL 数据库 (InnoDB) 中的文件导入数据。应用程序确保同时只有这 1 个写入过程。然而,可能还有多个并发的 readers。
现在我想知道,我是否应该,如果是,我该如何防止以下情况:
一次重复table-读取交易:
- reader R1 读取自 table T1
- reader R1 做某事。否则
- reader R1 读取自 table T2
如果 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.
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."
- 这个快照包含什么?只有第一次读取所读取的行的快照,完整的 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
- 在我的网络应用程序中,PHP 脚本从 MySQL 数据库 (InnoDB) 中的文件导入数据。应用程序确保同时只有这 1 个写入过程。然而,可能还有多个并发的 readers。 现在我想知道,我是否应该,如果是,我该如何防止以下情况:
一次重复table-读取交易:
- reader R1 读取自 table T1
- reader R1 做某事。否则
- reader R1 读取自 table T2
如果 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.