2014-01-07 34 views
1

我有一個處理客戶訂單的頁面,而且我遇到了一些事務(從一般意義上)問題。在PHP中使用異常和事務

我使用兩個外部服務(即Stripe for CC處理和Postmaster運輸)。我將這兩個服務稱爲try區塊,並將catch發送給它們。如果通過,我會在我的最後創建一個數據庫條目。用我目前的邏輯,我擔心如果Stripe和Postmaster調用成功,並且數據庫插入失敗,我無法回滾Stripe和Postmaster調用。有這樣的最佳做法嗎?

我使用Codeigniter MVC,所以我的db插入是通過調用返回true或false的模型方法完成的。

一般的思想:

try{ 
    //create charge and shipment 
    $charge = Stripe_Charge::create(); 

//create shipment 
$shipment = $this->postmaster->shipment_create(); 
} 

catch{ 
    //stripe and postmaster exceptions 
} 

$this->order_model->addOrder(); 

回答

3

寫入數據庫儘快。記錄數據庫中「交易」的狀態(例如,未處理的,發送給條帶,發送給郵政局長)。如果出現故障,請從DB,Stripe和Postmaster獲取的信息中恢復一致的狀態。您需要查詢Stripe和Postmaster,因爲狀態應該已經更新時可能發生故障。

您無法影響Stripe和Postmaster的可用性,但您始終可以使數據庫更可靠。

+0

我對你的回答有點困惑,但我確實喜歡整體的建議。我不確定我想要在db中記錄事務的'狀態',我希望它在失敗時不存在。另外,stripe和postmaster還會返回一些我想要進入db的'id'。顯然這不能先完成。這應該是try/catch之後的單獨查詢嗎? –

+0

如果你存儲了stripe和postmaster-id,那麼這些字段可以用來記錄和檢索狀態信息。最初將字段設置爲NULL。只要你有條紋ID,用該ID更新相應的字段。只要你有postmaster id,用該id更新相應的字段。 – Oswald

+0

難道我不會遇到同樣的初始問題嗎?如果我嘗試/捕獲條帶方法,獲取返回給我的ID,嘗試使用此ID更新我的數據庫,並且該更新失敗,則創建條帶電荷,但我沒有記錄它。我基本上認爲問題歸結爲什麼,是否需要有一種將外部服務調用與數據庫調用「配對」的方式,因此他們都調用所有提交或滾動支持。也許它目前不可能?我不知道,如果沒有,我會盡我所能 –