我正在閱讀Explicit Locks上的這個文檔,以及它們何時被PostgreSQL自動使用。PostgreSQL表鎖定衝突
當一個鎖與另一個鎖衝突時會發生什麼?第二筆交易是否等到第一筆交易完成?它會中止嗎?
所以說一些事務在名爲的表上打開一個ACCESS SHARE鎖。然後說另一個交易嘗試添加一個發出ALTER TABLE
查詢的列,該查詢是一個ACCESS EXCLUSIVE
鎖。第二個查詢會發生什麼?它掛了嗎?中止?
我正在閱讀Explicit Locks上的這個文檔,以及它們何時被PostgreSQL自動使用。PostgreSQL表鎖定衝突
當一個鎖與另一個鎖衝突時會發生什麼?第二筆交易是否等到第一筆交易完成?它會中止嗎?
所以說一些事務在名爲的表上打開一個ACCESS SHARE鎖。然後說另一個交易嘗試添加一個發出ALTER TABLE
查詢的列,該查詢是一個ACCESS EXCLUSIVE
鎖。第二個查詢會發生什麼?它掛了嗎?中止?
第二個查詢ALTER TABLE
等待第一個事務完成。你可以在pg_locks
中看到。
Select * from pg_locks;
爲了模擬這一情形: -
1)打開三個單獨的SQL中的pgAdmin
2)SQL編輯器1編輯:執行下面的語句
BEGIN;
Select * FROM table_name;
3 )SQL編輯器2:使用pg_locks
檢查鎖定。應該有AccessShareLock
4)SQL編輯器3:
BEGIN;
alter table table_name ADD COLUMN new_column varchar(30);
窗口應顯示Query is running
。
5)SQL編輯器2:使用pg_locks
檢查鎖。應該有AccessExclusiveLock
6)SQL編輯器1:執行END;
(即結束選擇交易)
7)SQL編輯器3:查詢(即改變表)應該被成功執行
8)SQL編輯器2:使用pg_locks
檢查鎖。不應該有任何 'AccessShare' 鎖
9)SQL編輯器3:執行END;
(即結束在alter table交易)
10)SQL編輯器2:檢查使用pg_locks
的鎖。不應該有任何'AccessExclusive'鎖。
postgresql在併發控制方面有很好的幫助。 https://www.postgresql.org/docs/9.1/static/mvcc.html – McNets