标签:
大家经常遇到这样的需求,尤其是支付中心接口的时候:
查询满足某种条件的订单,调用第三方接口成功,更改订单状态。
task1:
orders = queyrOrder(...); //查询已离店的订单 for (Map<String, Object> order : orders) { try { con.setAutoCommit( false ); String orderNo = (String) order.get( "order_no" ); // 调用支付中心返现接口 callCommission(order); //无论是网络异常还是返回结果失败,都抛异常 // 更改订单状态 cashedOrder(con, order); //更改订单状态 con.commit(); } |
task 2
orders = queyrOrder(...); //查询“返现中”的订单 for (Map<String, Object> order : orders) { con.setAutoCommit( false ); // 调用返现任务 callCommission(order); // 更改订单状态 cashedOrder(con, order); con.commit(); } |
往两个方面思考
方案
(幂等接口的方案)
queueOrders = queryQueueOrders(); for (QueueOrder order : queueOrders){ callApi() startTransaction(); lock(order); updateStatus() commitTransaction(); } |
(提供结果查询的API接口的方案)
queueOrders = queryQueueOrders(); for (QueueOrder order : queueOrders){ try { startTransaction(); if (isBeingProcess(order)){ Result r = queryAPIResult(); if (r.success()){ return ; } } lock(order); callApi() updateStatus(); } finally { commitTransaction(); } } |
注意:该示例依然有“在事务中调用远程接口的问题”
http://www.cnblogs.com/NanguoCoffee/archive/2013/03/30/2990918.html
标签:
原文地址:http://www.cnblogs.com/kms1989/p/5620950.html