Postgresql

交易中的交易

  • January 15, 2019

例如,如果呼叫下面的腳本,PostgreSQL 會顯示什麼行為

BEGIN;
SELECT * FROM foo;
INSERT INTO foo(name) VALUES ('bar');
BEGIN; <- The point of interest
END;

PostgreSQL 會丟棄第二個BEGIN,還是會隱式決定送出,然後在BEGIN END最後將塊作為單獨的事務執行?

您需要的是所謂的“自治事務”(oracle 提供的一項功能)。目前這在 PostgreSQL 中是不可能的。但是,您可以使用SAVEPOINT

BEGIN;
INSERT ...
SAVEPOINT a;
some error;
ROLLBACK TO SAVEPOINT a;
COMMIT;

它不完全是一項自主交易——但是,它可以讓您正確處理“每筆交易”。您可以使用它來實現您對自主事務的期望。

否則此時沒有其他合理的解決方案。

你可以自己試試:

警告:已經有一個事務在進行中

它不會啟動新的(子)事務,因為 PostgreSQL 中沒有實現嵌套事務。(例如,你可以在一個函式中做一些魔法pl/pgsql來模仿這種行為。)

對於 PostgreSQL 11,人們可能會認為新的真實儲存過程及其處理事務的能力將使嵌套事務成為可能。但是,根據文件,情況並非如此:

CALL命令呼叫的過程以及匿名程式碼塊 ( DOcommand) 中,可以使用命令COMMITROLLBACK. 使用這些命令結束事務後會自動啟動新事務,因此沒有單獨的 START TRANSACTION 命令。

引用自:https://dba.stackexchange.com/questions/81011