MySQL 是一款非常流行的開源數據庫管理系統,在多用戶操作數據的情況下,常常會出現讀寫沖突的情況。在 MySQL 中,讀和寫操作的鎖被分為兩種,分別是讀鎖和寫鎖。其中,讀鎖可以被多個客戶端同時獲取,而寫鎖只能被一個客戶端獨占。
當一個客戶端獲取了寫鎖之后,其他客戶端如果想要進行讀或寫操作,就必須等待當前寫鎖釋放。如果此時有其他客戶端已經獲取到了讀鎖,那么也會等待當前寫鎖釋放。這就是因為在 MySQL 中,寫鎖會等待讀鎖,但是讀鎖不會等待寫鎖。
SET autocommit = 0;
START TRANSACTION;
SELECT * FROM myTable WHERE id = 1 FOR UPDATE;
-- 這里獲取了id為1的行的寫鎖
UPDATE myTable SET name='new_name' WHERE id = 1;
-- 進行了寫操作
COMMIT;
在上面的代碼中,我們使用了 SELECT ... FOR UPDATE 關鍵字獲取了 id 為 1 的行的寫鎖。這意味著其他客戶端無論是讀操作還是寫操作,都必須等待我們對這一行的寫鎖釋放。
當然,如果我們使用了 SELECT ... LOCK IN SHARE MODE 關鍵字,那么就是獲取了 id 為 1 的行的讀鎖。此時其他客戶端可以繼續獲取該行的讀鎖,但是不能進行寫操作,只有在當前客戶端的讀鎖釋放之后,其他客戶端才能進行寫操作。
SET autocommit = 0;
START TRANSACTION;
SELECT * FROM myTable WHERE id = 1 LOCK IN SHARE MODE;
-- 這里獲取了id為1的行的讀鎖
COMMIT;
結論:在 MySQL 中,寫操作會等待讀鎖的釋放,讀操作不會等待寫鎖的釋放。