Mysql事务提交是不是按顺序?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Mysql事务提交是不是按顺序?相关的知识,希望对你有一定的参考价值。

有3个并发的mysql会话.2写入table1,一个读取table1。所有3个会话在执行事务之前引用一个唯一的锁,这用于授予没有人同时读/写table1

第1节

START TRANSACTION
SELECT id FROM global_lock WHERE id=1 FOR UPDATE;
t1 = GetCurrentTimeMills() // used psuedo code here
INSERT INTO table1 (value, updated) VALUES ('v1', t1);
COMMIT;

第二节

START TRANSACTION
SELECT id FROM global_lock WHERE id=1 FOR UPDATE;
t2 = GetCurrentTimeMills()  // used pseudo code here
INSERT INTO table1 (value, updated) VALUES ('v2', t2);
COMMIT;

第3节

START TRANSACTION
SELECT id FROM global_lock WHERE id=1 FOR UPDATE;
SELECT * FROM table1 WHERE updated> t1 -1;
COMMIT;
  • 会话3仅返回在t2创建的值。它缺少在t1创建的值,早于t2。
  • 如果我第二次执行会话3,我会在t1和t2处创建两个值。

我正在使用带有mysql 5.7.17的InnoDB引擎。我假设mysql在某种程度上不遵守提交顺序。

如何避免这种情况,是否有任何解决方法或配置更改以强制mysql遵守提交顺序?

答案

这三个交易行为正确。

Mysql innodb隔离级别和锁具有复杂的语义,并不总是易于调试。在开始交易之前,您可能更愿意获得外部锁定。考虑使用https://linux.die.net/man/1/flock(或:brew install flock)。

以上是关于Mysql事务提交是不是按顺序?的主要内容,如果未能解决你的问题,请参考以下文章

我是不是需要事务才能按顺序获得正确的最后插入 ID?

mysql事务之间的隔离级别

MySQL Binlog 组提交实现

scrapy按顺序启动多个爬虫代码片段(python3)

MySQL5.7二进制日志

是否可以按顺序执行 pentaho 步骤?