?
このドキュメントでは、 php中國語ネットマニュアル リリース
PREPARE TRANSACTION transaction_id
PREPARE TRANSACTION為當前事務的兩階段提交做準備。在命令之后, 事務就不再和當前會話關聯(lián)了; 它的狀態(tài)完全保存在磁盤上,它提交成功有非常高的可能性,即使是在請求提交之前數(shù)據(jù)庫發(fā)生了崩潰也如此。
一旦準備好了,一個事務就可以在稍后用 COMMIT PREPARED或ROLLBACK PREPARED命令分別進行提交或者 回滾。這些命令可以從任何會話中發(fā)出,而不光是最初執(zhí)行事務的那個會話。
從發(fā)出命令的會話的角度來看,PREPARE TRANSACTION不同于ROLLBACK:在執(zhí)行它之后,就不再有活躍的當前事務了,并且預 備事務的效果無法見到(在事務提交的時候其效果會再次可見)。
如果PREPARE TRANSACTION因為某些原因失敗,那么它就會變成一個ROLLBACK, 當前事務被取消。
一個任意的標識符,用于后面在COMMIT PREPARED或ROLLBACK PREPARED的時候標識 這個事務。 這個標識符必須以字符串文本的方式書寫,并且必須小于200字節(jié)長。它不能和任何當前預備事務已經(jīng)使用了 的標識符同名。
PREPARE TRANSACTION不是打算用于應用程序或者交互會話的。其目的是允許一個 內(nèi)部事務管理器來跨多個數(shù)據(jù)庫或其他事務性資源執(zhí)行自動全局事務。除非你在寫一個事務管理器, 你可能不會使用PREPARE TRANSACTION。
該命令必須在一個事物內(nèi)部使用。使用BEGIN來啟動一個。
目前還不允許PREPARE一個已經(jīng)執(zhí)行包括臨時表在內(nèi)的任意事務,創(chuàng)建任何游標 WITH HOLD,或者執(zhí)行LISTEN或者UNLISTEN。 那些特性與當前在預備事務中有用的會話聯(lián)系太緊。
若事務通過SET調(diào)整任意運行時參數(shù)(沒有LOCAL選項), 那些影響在PREPARE TRANSACTION之后仍然保留,并且將會受后來的 COMMIT PREPARED或者ROLLBACK PREPARED影響。 因此,在這一點上,PREPARE TRANSACTION表現(xiàn)的更像COMMIT而非 ROLLBACK。
所有目前可用的預備事務都在系統(tǒng)視圖 pg_prepared_xacts里面列出。
Caution |
使食物長時間處于預備狀態(tài)是不明智的。這將干擾VACUUM回收存儲的能力, 并且在極端情況下可能導致數(shù)據(jù)庫關閉以組織食物ID環(huán)繞式處理(參閱Section 23.1.4)。也請記住事務將繼續(xù)持有它持有的任何鎖, 該特性的預期使用方法是:內(nèi)部事務管理器一旦核實其他數(shù)據(jù)庫也預備提交,一個預備事 務通常就將會提交或者回滾。 如果您沒有設置一個內(nèi)部事務管理器來跟蹤預備事務并確保他們得到及時關閉,最好是 通過將max_prepared_transactions設置為0來保持預備事務功能禁用。 這將阻止預備事務的意外創(chuàng)建,那可能會被遺忘或者最終引發(fā)問題。 |
把當前事務為兩階段提交做準備,使用foobar做為事務標識符:
PREPARE TRANSACTION 'foobar';