在 MySQL 中可以强制事务按顺序发生吗?

Tre*_*ham 0 mysql innodb

假设我有两台服务器同时使用 InnoDB 在 MySQL 5.5 数据库上启动事务。两个事务都做同样的事情:读取一行,然后根据其内容更新该行。我想确保两个事务一个接一个地运行。也就是说,在第一个事务完成之前,不应允许第二个事务读取该行。理想情况下,这意味着SELECT第二个事务中的语句将等到第一个事务提交后,然后返回更新后的值。

这可能吗?如果没有,是否有比 MySQL 更适合此任务的数据库?

如果是这样,一个相关的问题:假设第一台服务器在交易过程中崩溃,所以没有COMMIT收到任何消息。我将如何设置超时后事务将自动回滚,以便第二个事务不会永远延迟?(更新:我已经把它作为一个单独的问题分开了。)

Tre*_*ham 5

好的,我采纳了 Shane 的建议,并把它变成了一个测试用例。我有一个表nsync,其中一行带有 id1和 value foo。然后我运行这个事务:

START TRANSACTION;
SELECT * FROM nsync WHERE id = '1' FOR UPDATE;
SELECT SLEEP(10);
UPDATE nsync SET stringy = 'bar' WHERE id = '1';
COMMIT;
Run Code Online (Sandbox Code Playgroud)

在睡眠间隔期间我跑

SELECT * FROM nsync WHERE id = '1' FOR UPDATE;
Run Code Online (Sandbox Code Playgroud)

有用!该SELECT直到第一个事务等待已完成,并返回更新后的值bar

请注意,两个 SELECT语句都使用FOR UPDATE;很重要。如果第一个SELECT没有使用它,则该行不会被锁定;如果第二个SELECT不使用它,它就不会关心锁。