在資料庫操作中,除了行級鎖定外,還有一種更廣泛的鎖定機制,稱為表級鎖定
當交易需要對整個資料表進行某些操作,如修改資料表結構或對多行數據進行讀/寫時,表級鎖定就派上了用場
表級鎖定,如其名,是鎖定整個資料表的機制
也就是說當一個交易對一個資料表進行鎖定時,其他交易可能無法對該資料表進行某些操作,直到鎖定模式被釋放
想像一下,如果你正在對一個大型的資料表進行結構修改,像是新增一個新欄位,而其他交易正在嘗試查詢或修改該資料表的數據。
如果沒有適當的鎖定機制,可能最後會導致資料不一致或其他未預期的結果
BEGIN;
LOCK TABLE books IN ACCESS SHARE MODE;
SELECT * FROM books;
COMMIT;
BEGIN;
LOCK TABLE products IN ROW SHARE MODE;
UPDATE products SET stock = stock - 1 WHERE product_id = 5;
COMMIT;
BEGIN;
LOCK TABLE products IN ROW EXCLUSIVE MODE;
UPDATE products SET price = price * 0.9 WHERE discount = TRUE;
COMMIT;
BEGIN;
LOCK TABLE orders IN SHARE UPDATE EXCLUSIVE MODE;
-- 這邊的操作不能更改資料表結構
COMMIT;
BEGIN;
LOCK TABLE customers IN SHARE MODE;
SELECT * FROM customers WHERE review_status = 'pending';
COMMIT;
BEGIN;
LOCK TABLE customers IN SHARE ROW EXCLUSIVE MODE;
UPDATE customers SET credit_rating = 'A' WHERE purchase_history > 1000;
COMMIT;
BEGIN;
LOCK TABLE orders IN EXCLUSIVE MODE;
-- 這邊進行備份操作
COMMIT;
BEGIN;
LOCK TABLE users IN ACCESS EXCLUSIVE MODE;
ALTER TABLE users DROP COLUMN old_data;
COMMIT;