簡體   English   中英

PHP和PostgreSQL事務?

[英]PHP and PostgreSQL Transactions?

很久以前,我寫了一個處理postgresql db連接的php類。
我已將事務添加到插入/更新功能中,對我來說很好用。 但是最近我發現了有關“ pg_prepare”函數的信息。
我對該函數的功能以及是否最好切換到該函數感到困惑。

目前,每當我執行插入/更新操作時,我的sql如下所示:

$transactionSql = "PREPARE TRANSACTION ".md5(time()).";"
                  .$theUpdateOrDeleteSQL.";".
                  ."COMMIT;";

This will return something like:
PREPARE TRANSACTION '4601a2e4b4aa2632167d3cc62b516e6d';
INSERT INTO users (username,g_id,email,password)
            VALUES('test',  '1', 'test','1234');
COMMIT;

我已經使用關系構建了數據庫,並且正在使用(如果可能):

 ON DELETE CASCADE
 ON UPDATE CASCADE

但是我想100%確保數據庫中的內容是干凈的,如果/在更新/刪除或插入時失敗,則不會有剩余。

如果您可以分享您對pg_prepare的意見/經驗,那會很好,我是否真的需要“准備交易”以及任何其他可能對我有幫助的事情? :)

不,您不需要兩階段提交!...

為了安全地處理PHP數據庫,請勿直接使用pg_query,而應將其包裝在執行以下操作的特殊函數中:

  • 在您的第一個查詢中打開數據庫連接
  • 如果使用持久連接,請確保連接處於已知狀態
  • register_shutdown_function發出一個ROLLBACK的函數
  • 確保關閉自動提交功能,或者在第一個查詢之前簡單地發出BEGIN
  • 記錄數據庫錯誤和慢查詢
  • 只使用pg_query_params()很好地照顧了SQL注入

這樣,如果腳本崩潰或發生任何其他情況,則會自動發出回滾。 您只能通過顯式提交來提交。

如果您使用持久性連接,請當心:php對pg_pconnect的處理有點...越野車。

不,您不需要准備交易(這是針對跨不同服務器的分布式交易的-正如Milen所指出的那樣。

我不確定PHP接口如何處理該問題,但是只要您可以確保未在自動提交模式下運行,就可以了。

如果您無法控制自動提交模式,只需將您的語句放入BEGIN ... COMMIT塊中

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM