更新時阻止 MySQL 讀取
P粉190883225
P粉190883225 2023-11-07 18:05:53
0
1
633

我有兩個簡單的查詢,一個是讀取表,一個是更新表。如何在更新查詢執行時間鎖定選擇查詢的讀取。現在在 MySQL InnoDB 中,我注意到寫入/更新預設是鎖定的,但讀取/選擇在事務之前取得舊資料。

我嘗試在更新查詢中使用事務,然後 SELECT ... FOR UPDATE - 在事務之外 - 但它似乎沒有成功。另外,出於測試目的,我想知道如何減慢 UPDATE 查詢的速度。我遇到了 SLEEP(X),但我不知道如何在更新查詢中實現它。

如何讓每個查詢等待讀取/寫,直到寫入完成。

P粉190883225
P粉190883225

全部回覆(1)
P粉877114798

使用READ-COMMITTED交易將查看最新提交的交易。更改,並使用SELECT ... LOCK IN SHARE MODE 將使讀取阻塞,直到提交任何未完成的更新。

試試這個。在一個畫面中,啟動事務和更新。不需要 SLEEP(),只是不提交交易。 UPDATE 建立的鎖定將繼續存在,直到您提交為止。

BEGIN;
UPDATE MyTable SET something = '1234' WHERE id = 3;

先不要提交。

同時,在第二個畫面中,將交易隔離設定為讀取提交交易。無需啟動明確事務,因為 InnoDB 查詢使用事務,即使它是自動提交的。

SET tx_isolation='READ-COMMITTED';

SELECT * FROM MyTable WHERE id = 3 LOCK IN SHARE MODE;
<hangs>

共享模式中的鎖定使其等待,因為仍有一個由更新創建的未完成的排他鎖。

在第一個畫面:

COMMIT;

在第二個畫面中,瞧!阻塞讀取將解除阻塞,您可以立即看到 UDPATE 的結果,而無需刷新交易。

熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板