有3个并发的mysql会话.2写入table1,一个读取table1。所有3个会话在执行事务之前引用一个唯一的锁,这用于授予没有人同时读/写table1
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;
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创建两个值。
我使用InnoDB引擎和mysql 5.7.17。我认为mysql在某种程度上并不遵守提交顺序。
如何避免这种情况,是否有任何解决方法或配置更改以强制mysql遵守提交顺序?