mysql中的并行事务

Tej*_*eja 4 mysql transactions

我的数据库包含sample_table一个名为由一列命名user_first_name的表,该表为空

假设我有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
Run Code Online (Sandbox Code Playgroud)

我以这种方式并行运行这两个事务,首先是transaction1启动,然后是transaction1运行时的transaction2.我希望结果会有一些名为TEJA的行.但我得到一个空洞的结果.请帮我解释为什么结果是空的?

fan*_*nts 13

这一切都取决于ISOLATION LEVEL你的设定.

您可以看到使用此查询设置的那个:

select @@global.tx_isolation, @@session.tx_isolation;
Run Code Online (Sandbox Code Playgroud)

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

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

  • 失去了更新:两个事务修改表中的并行条目.两个事务完成后,只应用一个修改.

  • 不可重复读:读Reoccuring导致不同的结果.

  • 幻读:一个事务其他事务添加,删除或修改表条目在.

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

Read Uncommitted:
使用此隔离级别读取操作会忽略任何类型的锁定,因此可能会出现上述任何问题.

Read Committed:
此隔离级别为应修改的对象上的整个事务设置写锁定.读锁仅在读取数据时设置.因此,可能发生不可重复的读取和幻像读取.

可重复读取:
通过此隔离级别确保,当参数相同时,重新读取操作总是产生相同的结果.锁定被设置为在事务的总持续时间内进行读取和写入操作.因此,只能进行幻像读取.

可序列化:
最高隔离级别保证,并行运行事务的结果与事务将一个接一个地运行的结果相同.大多数数据库并不是真的一个接一个地运行这些事务,而是会造成太多的性能损失.因此,可能会发生一个事务中止.例如,MySQL通过MVCC(多版本并发控制)实现了这一点.谷歌,如果你想了解更多.对于这个答案来说太过分了.

总而言之,这个表格也解释了它:

                 | 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
Run Code Online (Sandbox Code Playgroud)
  • 在本手册中,有关于它的更多信息以及如何设置隔离级别.