我有两个简单的查询,一个读取,一个更新表。如何在更新查询运行时锁定选择查询的读取。现在在MySQL InnoDB中,我注意到写入/更新默认是锁定的,但是读取/选择是在事务之前获取旧数据。
我尝试在更新查询中使用事务,然后在事务之外使用SELECT ... FOR UPDATE
- 但它似乎没有做到这一点。此外,我想知道,为了测试目的,如何减慢UPDATE查询。我遇到了SLEEP(X),但我不知道如何在更新查询中实现它。
如何在写入完成之前让每个查询等待读/写。
答案 0 :(得分:1)
使用READ-COMMITTED
事务将查看最新提交的内容。更改,并使用SELECT ... LOCK IN SHARE MODE
将进行读取阻止,直到提交任何未完成的更新。
试试这个。在一个屏幕中,启动事务和更新。不需要SLEEP(),只是不提交事务。 UPDATE创建的锁将继续存在,直到您提交。
BEGIN;
UPDATE MyTable SET something = '1234' WHERE id = 3;
不要提交。
同时,在第二个屏幕中,将事务隔离设置为read-committed事务。无需启动显式事务,因为InnoDB查询使用事务,即使它是自动提交。
SET tx_isolation='READ-COMMITTED';
SELECT * FROM MyTable WHERE id = 3 LOCK IN SHARE MODE;
<hangs>
LOCK IN SHARE MODE让它等待,因为UPDATE仍然有一个未完成的独占锁。
在第一个屏幕中:
COMMIT;
在第二个屏幕中,瞧!阻塞读取将被取消阻止,您无需刷新事务即可立即看到UDPATE的结果。