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