如何将事务相关代码转换为非事务相关代码?

时间:2010-07-20 14:02:58

标签: transactions

几个月前,我听说亚马逊倾向于将所有交易运输代码(也有另一个问题,它们分别称为“分片”)更改为非交易代码。

some_buy_method()

  check_item_stock()

  remove_item_from_stock()

  add_to_order()

end

2 个答案:

答案 0 :(得分:2)

第一个答案:有困难。

第二个答案:可能带来灾难性后果。

我怀疑亚马逊想要消除所有交易。他们可能想要做的是放宽ACID条件以提高可伸缩性和availability:他们仍然需要原子性和持久性,但必须重构commutativity and idempotence的操作并添加{{3处理降低的一致性和隔离度。

答案 1 :(得分:1)

我听说eBay也在没有交易的情况下运行,也许亚马逊会采用类似的方法。

来自The eBay Architecture(幻灯片18,23):

  

绝对没有客户端交易

     

我们如何将其拉下来?

     

- 仔细订购数据库操作
   - 通过
恢复    •异步恢复事件
   •对帐批次    •故障转移到异步流

     

原理

     

- 避免死锁
   - 避免耦合可用性
   - 更新并发性    - 无缝处理拆分eBay

(抱歉格式化)

对我来说,看起来如果没有ACID交易,您需要手动检查,恢复或补偿。但确切的业务逻辑是已知的,因此可以设计出适当的错误处理或冲突策略。这也使我在BPEL中处理错误,事情是异步的,我们编写补偿处理程序。