2016-11-08 108 views
0

我正在閱讀Explicit Locks上的這個文檔,以及它們何時被PostgreSQL自動使用。PostgreSQL表鎖定衝突

當一個鎖與另一個鎖衝突時會發生什麼?第二筆交易是否等到第一筆交易完成?它會中止嗎?

所以說一些事務在名爲​​的表上打開一個ACCESS SHARE鎖。然後說另一個交易嘗試添加一個發出ALTER TABLE查詢的列,該查詢是一個ACCESS EXCLUSIVE鎖。第二個查詢會發生什麼?它掛了嗎?中止?

+0

postgresql在併發控制方面有很好的幫助。 https://www.postgresql.org/docs/9.1/static/mvcc.html – McNets

回答

0

第二個查詢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'鎖。