mysql 中的并行事务

Parallel Transactions in mysql

我的数据库包含名为 sample_table 的 table,其中包含一个名为 user_first_name 的列,而 table 为空

假设我有 2 笔这样的交易

START TRANSACTION;
INSERT INTO sample_table VALUES("TEJA");
INSERT INTO sample_table VALUES("TEJA");
INSERT INTO sample_table VALUES("TEJA");
INSERT INTO sample_table VALUES("TEJA");
INSERT INTO sample_table VALUES("TEJA");
INSERT INTO sample_table VALUES("TEJA");
INSERT INTO sample_table VALUES("TEJA");
//......... till 10000 times
COMMIT

START TRANSACTION;
SELECT * FROM sample_table;
SELECT * FROM sample_table;
SELECT * FROM sample_table;
SELECT * FROM sample_table;
SELECT * FROM sample_table;
SELECT * FROM sample_table;
//........ till 10000 times 
COMMIT

我运行这两个事务是这样并行的,先是transaction1开始,然后是transaction2,此时transaction1是运行ning。我预计结果将包含一些名为 TEJA 的行。但我得到的结果是空的。 请帮我解释一下为什么结果是空的?

这完全取决于您设置的ISOLATION LEVEL

您可以通过此查询查看您设置的是哪一个:

select @@global.tx_isolation, @@session.tx_isolation;

在解释不同的隔离级别之前,让我解释一下他们试图避免的问题:

  • 脏读: 一个尚未完成的事务的数据被另一个事务读取。

  • 丢失更新:两个事务并行修改table中的条目。当两个事务都完成时,只应用一个修改。

  • 非重复table读取:重复读取导致不同的结果。

  • 幻读:在事务期间另一个事务添加或删除table条目。

现在针对不同的隔离级别。

读取未提交:
使用此隔离级别,读取操作将忽略任何类型的锁,因此可能会发生上述任何问题。

读取已提交:
此隔离级别为应修改的对象的整个事务设置写锁。只在读数据时设置读锁。因此,可能会发生非重复table 读取和幻读。

重复table阅读:
使用此隔离级别可以确保,当参数相同时,重复发生的读取操作始终会产生相同的结果。在事务的整个持续时间内为读取和写入操作设置锁。因此只会发生幻读。

可序列化:
最高隔离级别保证并行 运行ning 事务的结果与事务 运行ning 一个接一个地进行的结果相同。大多数数据库并不真正运行那些事务一个接一个地进行,这将是一个太大的性能损失。因此,可能会发生一个事务被中止的情况。 MySQL 例如用 MVCC(多版本并发控制)实现这一点。 Google它,如果你想了解更多。这个答案太多了。

总而言之table也解释了它:

                 | Lost updates | Dirty Read | Non-Repeatable Read | Phantom Read
---------------------------------------------------------------------------------
Read Uncommitted | possible     | possible   | possible            | possible
Read Committed   | impossible   | impossible | possible            | possible
Repeatable Read  | impossible   | impossible | impossible          | possible
Serializable     | impossible   | impossible | impossible          | impossible
  • 在此 manual entry 中提供了有关它以及如何设置隔离级别的更多信息。

所有这些只是关系数据库管理系统的理论。然而,由于MySQL使用MVCC(多版本并发控制),使用InnoDB和repeatable读取隔离级别时不会发生幻读
来自 manual:

REPEATABLE READ

This is the default isolation level for InnoDB. Consistent reads within the same transaction read the snapshot established by the first read. This means that if you issue several plain (nonlocking) SELECT statements within the same transaction, these SELECT statements are consistent also with respect to each other.