PostgreSQL PREPARE TRANSACTION

2021-09-13 11:09 更新

PREPARE TRANSACTION — 為兩階段提交準備當前事務(wù)

大綱

PREPARE TRANSACTION transaction_id

描述

PREPARE TRANSACTION為兩階段提交準備 當前事務(wù)。在這個命令之后,該事務(wù)不再與當前會話關(guān)聯(lián)。相反,它的狀態(tài) 被完全存儲在磁盤上,并且有很高的可能性它會被提交成功(即便在請求提 交前發(fā)生數(shù)據(jù)庫崩潰)。

一旦被準備好,事務(wù)稍后就可以分別用 COMMIT PREPARED 或者ROLLBACK PREPARED提交或者回滾??梢詮娜魏? 會話而不僅僅是執(zhí)行原始事務(wù)的會話中發(fā)出這些命令。

從發(fā)出命令的會話的角度來看,PREPARE TRANSACTION不像ROLLBACK命令: 在執(zhí)行它之后,就沒有活躍的當前事務(wù),并且該預(yù)備事務(wù)的效果也不再可見( 如果該事務(wù)被提交,效果將重新變得可見)。

如果由于任何原因PREPARE TRANSACTION 命令失敗,它會變成一個ROLLBACK:當前事務(wù)會被取消。

參數(shù)

transaction_id

一個任意的事務(wù)標識符, COMMIT PREPARED或者ROLLBACK PREPARED 以后將用這個標識符來標識這個事務(wù)。該標識符必須寫成一個字符串, 并且長度必須小于 200 字節(jié)。它也不能與任何當前已經(jīng)準備好的事務(wù)的標識符相同。

注解

PREPARE TRANSACTION并不是設(shè)計為在應(yīng)用或者交互式 會話中使用。它的目的是允許一個外部事務(wù)管理器在多個數(shù)據(jù)庫或者其他事務(wù)性 來源之間執(zhí)行原子的全局事務(wù)。除非你在編寫一個事務(wù)管理器,否則你可能不會 用到PREPARE TRANSACTION。

這個命令必須在一個事務(wù)塊中使用。事務(wù)塊用BEGIN開始。

當前在已經(jīng)執(zhí)行過任何涉及到臨時表或者會話的臨時命名空間、創(chuàng)建帶 WITH HOLD的游標或者執(zhí)行 LISTEN、UNLISTENNOTIFY的 事務(wù)中,不允許PREPARE該事務(wù)。這些特性與當前會話 綁定得太過緊密,所以對一個要被準備的事務(wù)來說沒有什么用處。

如果用SET(不帶LOCAL選項)修改過事務(wù)的 任何運行時參數(shù),這些效果會持續(xù)到 PREPARE TRANSACTION之后,并且將不會被后續(xù)的任何 COMMIT PREPAREDROLLBACK PREPARED所影響。因此,在這一 方面PREPARE TRANSACTION的行為更像 COMMIT而不是ROLLBACK。

所有當前可用的準備好事務(wù)被列在pg_prepared_xacts系統(tǒng)視圖中。

小心

讓一個事務(wù)處于準備好狀態(tài)太久是不明智的。這將會干擾 VACUUM回收存儲的能力,并且在極限情況下可能導(dǎo)致 數(shù)據(jù)庫關(guān)閉以阻止事務(wù) ID 回卷(見第 24.1.5 節(jié))。還要記住,該事務(wù)會繼續(xù)持有 它已經(jīng)持有的鎖。該特性的設(shè)計用法是,只要一個外部事務(wù)管理器已經(jīng)驗證 其他數(shù)據(jù)庫也準備好了要提交,一個準備好的事務(wù)將被正常地提交或者回滾。

如果沒有建立一個外部事務(wù)管理器來跟蹤準備好的事務(wù)并且確保它們被迅速地 結(jié)束,最好禁用準備好事務(wù)特性(設(shè)置 max_prepared_transactions為零)。這將防止意外 地創(chuàng)建準備好事務(wù),不然該事務(wù)有可能被忘記并且最終導(dǎo)致問題。

例子

為兩階段提交準備當前事務(wù),使用foobar作為事務(wù)標識符:

PREPARE TRANSACTION 'foobar';

兼容性

PREPARE TRANSACTION是一種 PostgreSQL擴展。其意圖是用于 外部事務(wù)管理系統(tǒng),其中有些已經(jīng)被標準涵蓋(例如 X/Open XA), 但是那些系統(tǒng)的 SQL 方面未被標準化。


以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號