Ich habe zwei einfache Abfragen, eine zum Lesen der Tabelle und eine zum Aktualisieren der Tabelle. So sperren Sie das Lesen einer Auswahlabfrage, während die Aktualisierungsabfrage ausgeführt wird. Jetzt ist mir in MySQL InnoDB aufgefallen, dass Schreib-/Aktualisierungsvorgänge standardmäßig gesperrt sind, Lese-/Auswahlvorgänge jedoch vor der Transaktion alte Daten abrufen.
Ich habe versucht, eine Transaktion innerhalb der Aktualisierungsabfrage und dann SELECT ... FOR UPDATE
– außerhalb der Transaktion – zu verwenden, aber es schien nicht erfolgreich zu sein. Zu Testzwecken würde ich außerdem gerne wissen, wie man UPDATE-Abfragen verlangsamt. Ich bin auf SLEEP(X) gestoßen, weiß aber nicht, wie ich es in einer Update-Abfrage implementieren soll.
So lassen Sie jede Abfrage auf Lese-/Schreibvorgänge warten, bis der Schreibvorgang abgeschlossen ist.
使用
READ-COMMITTED
事务将查看最新提交的事务。更改,并使用SELECT ... LOCK IN SHARE MODE
将使读取阻塞,直到提交任何未完成的更新。试试这个。在一个屏幕中,启动事务和更新。不需要 SLEEP(),只是不提交事务。 UPDATE 创建的锁将继续存在,直到您提交为止。
先不要提交。
同时,在第二个屏幕中,将事务隔离设置为读提交事务。无需启动显式事务,因为 InnoDB 查询使用事务,即使它是自动提交的。
共享模式中的锁使其等待,因为仍有一个由更新创建的未完成的排他锁。
在第一个屏幕中:
在第二个屏幕中,瞧!阻塞读取将解除阻塞,您可以立即看到 UDPATE 的结果,而无需刷新事务。