假设我有两台服务器同时使用 InnoDB 在 MySQL 5.5 数据库上启动事务。两个事务都做同样的事情:读取一行,然后根据其内容更新该行。我想确保两个事务一个接一个地运行。也就是说,在第一个事务完成之前,不应允许第二个事务读取该行。理想情况下,这意味着SELECT第二个事务中的语句将等到第一个事务提交后,然后返回更新后的值。
这可能吗?如果没有,是否有比 MySQL 更适合此任务的数据库?
如果是这样,一个相关的问题:假设第一台服务器在交易过程中崩溃,所以没有COMMIT收到任何消息。我将如何设置超时后事务将自动回滚,以便第二个事务不会永远延迟?(更新:我已经把它作为一个单独的问题分开了。)
好的,我采纳了 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不使用它,它就不会关心锁。
| 归档时间: |
|
| 查看次数: |
855 次 |
| 最近记录: |