2010-06-28 79 views
0

我正在使用MySQL + PHP。我有一些代碼可以根據自動付款表何時到期自動生成付款(因此您可以計劃未來付款...等)。自動腳本在網站上運行後運行,有時會同時運行兩次。爲了避免這種情況,我們生成一個uuid用於支付某個特定自動付款的第n次付款。我們還使用交易來封裝整個付款生成流程。使用插入忽略(或類似)和唯一ID的MySQL事務處理

作爲其中的一部分,如果存在重複的uuid,我們需要整個事務失敗,但獲取實際的數據庫錯誤會向用戶顯示錯誤。我可以在付款插入SQL中使用插入忽略嗎?警告是否會終止交易?如果沒有,如果有重複的uuid,我該如何殺掉交易?

澄清:如果INSERT失敗,我如何才能讓它不會拋出程序停止錯誤,而是終止/回滾事務?

請注意,插入會在提交時失敗,而不是在PHP中的初始執行。

非常感謝!

+0

從您的問題確切地說明交易是如何處理的並不清楚。一些更具體的例子可能有助於縮小合適的解決方案。在嘗試插入之前,是否有原因檢查是否存在UUID?如果您使用的是交易,則應該注意回滾任何更改。如果一切都失敗了,你可以使用[handlers](http://dev.mysql.com/doc/refman/5.0/en/declare-handler.html)來執行一種形式的異常處理,但不應該這樣做以妥善構建的重複測試爲代價。 – Mike 2010-06-28 21:36:24

回答

1

也許還有另一種方法 - 確保相同的UUID不會被讀取兩次,而不是依賴查詢失敗。

我猜你在處理它並插入之前從另一個表中獲取UUID。 當您閱讀記錄時,您可以使用交易,然後使用SELECT ... FOR UPDATE。這樣您讀取的記錄被鎖定。當您將所有數據更新爲status列以「處理」和COMMIT事務。 最後,確保該進程不讀取狀態爲「已處理」的記錄。

希望這會有所幫助...

0

只是偶然發現了這一點。這是一個古老的問題,但我會盡力給出答案。

首先:確保您的付款作業一次只運行一次。猜猜可以爲你節省很多麻煩。

第二:如果你的更新語句在php中失敗,把它放在try-catch塊中。這樣你的mysql查詢失敗,但錯誤將不會顯示給用戶,你可以處理它。

try { 
    ... your mysql code here .... 
} catch (Exception $e) { 
    ... do whatever needs to be done in case of problem ... 
} 

請記住,有很多可能的異常來源。切勿將失敗的插頁作爲理所當然的理由。