我無法理解鎖與Postgres中的交易如何交互。交易中的Postgres鎖
當我運行這個(長)查詢,我被高度鎖定的出現感到驚訝:
BEGIN;
TRUNCATE foo;
\COPY foo FROM 'backup.txt';
COMMIT;
的爲\COPY
沒有提到它需要什麼級別的鎖,但是this post指示它只會得到一個RowExclusiveLock。但是,當我運行\COPY
在此查詢:
SELECT mode, granted FROM pg_locks
WHERE relation='foo'::regclass::oid;
我得到這個:
mode granted
RowExclusiveLock true
ShareLock true
AccessExclusiveLock true
凡到底是AccessExclusiveLock來自哪裏?我假設它來自TRUNCATE
,其中requires an AccessExclusiveLock。但TRUNCATE
快速完成,所以我希望鎖也能很快發佈。這讓我有幾個問題。
當通過事務中的命令獲取鎖定時,是否在命令末尾(事務結束之前)釋放該鎖定?如果是這樣,爲什麼我會觀察上述行爲?如果不是,爲什麼不呢?實際上,由於transactions don't touch the table until the COMMIT
,爲什麼交易中的TRUNCATE
需要根本阻止表?
我在PG中沒有在documentation中看到transactions的任何討論。
謝謝@Laurenz!儘管如此,我仍然很難理解交易中的TRUNCATE是如何工作的。如果「'TRUNCATE'確實清空了表格」,並且「'ROLLBACK' [不]觸摸表格」,那麼'TRUNCATE'如何回滾? –
我也很難理解「髒讀」是什麼意思(我在[docs](https://www.postgresql.org/docs/current/static/transaction-iso.html)中看到它提到) ,但這可能需要自己的問題。 –
我解釋了「髒讀」並添加了一個鏈接。你是對的,當談到'TRUNCATE'時,我的解釋有點不一致。正如[在代碼中所述](https://git.postgresql.org/gitweb/?p=postgresql.git;a=blob;f=src/backend/commands/tablecmds.c;h=f97bee5b0e464265e2af103053800900f40058ff;hb=HEAD #l1214),舊錶不會立即拋出,而是在提交時,所以在這種情況下,「COMMIT」並不完全觸及表,而是將其刪除。我會盡力在我的解釋中更清楚。 –