我有一个处理客户订单的页面,而且我遇到了一些交易(从一般意义上讲)。
我使用两种外部服务(即用于CC处理的Stripe和用于发货的Postmaster)。我在try
块中调用这两个服务,并在catch
发送任何例外。如果通过我在我的末尾创建一个DB条目。根据我当前的逻辑,我担心的是如果Stripe和Postmaster调用成功,并且我的数据库插入失败,我无法回滚Stripe和Postmaster调用。这样的事情有最好的做法吗?
我正在使用Codeigniter MVC,因此我的数据库插入是通过调用返回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();
答案 0 :(得分:3)
尽快写入数据库。记录数据库中“事务”的状态(例如未处理,发送到条带,发送给postmaster )。如果出现故障,请从DB,Stripe和Postmaster获取的信息中恢复一致状态。您需要查询Stripe和Postmaster,因为当状态应该更新时可能发生了故障。
您无法影响Stripe和Postmaster的可用性,但您始终可以使数据库更可靠。