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();
我對你的回答有點困惑,但我確實喜歡整體的建議。我不確定我想要在db中記錄事務的'狀態',我希望它在失敗時不存在。另外,stripe和postmaster還會返回一些我想要進入db的'id'。顯然這不能先完成。這應該是try/catch之後的單獨查詢嗎? –
如果你存儲了stripe和postmaster-id,那麼這些字段可以用來記錄和檢索狀態信息。最初將字段設置爲NULL。只要你有條紋ID,用該ID更新相應的字段。只要你有postmaster id,用該id更新相應的字段。 – Oswald
難道我不會遇到同樣的初始問題嗎?如果我嘗試/捕獲條帶方法,獲取返回給我的ID,嘗試使用此ID更新我的數據庫,並且該更新失敗,則創建條帶電荷,但我沒有記錄它。我基本上認爲問題歸結爲什麼,是否需要有一種將外部服務調用與數據庫調用「配對」的方式,因此他們都調用所有提交或滾動支持。也許它目前不可能?我不知道,如果沒有,我會盡我所能 –