Python(PostgreSQL)在一个事务中包装本地和远程调用

时间:2015-01-19 08:51:44

标签: python postgresql psycopg2 xmlrpclib

我在Odoo中的两个数据库之间进行同步。如果它在远程上没有任何问题,那么它在两侧同步。但是如果远程出现问题,则提交本地数据库更改,但远程不提交。 换句话说,数据库不同步。

是否有办法在本地数据库中进行更改,如果出现问题,尝试同步远程数据库,则将本地数据库回滚到以前的状态。

有这种方法:

@api.one
def order_process_now(self):
    servers = self._synchro_before_sale()
    # Process local order
    inv_id = self.action_invoice_create()
    if inv_id:
        inv = self.env['account.invoice'].search([('id', '=', inv_id)])
        inv.signal_workflow('invoice_open')
    for picking in self.picking_ids:
        picking.force_assign()
        picking.action_done()
    # Process remote orders
    self._remote_order_action('order_process_now', servers)

正如您所看到的,它分为两部分。首先,它对本地数据库进行更改,然后在远程进行更改(使用xmlrpcliberppeek包装器进行更改。 如何将此方法作为一个事务,因此如果执行方法出错,对数据库的任何更改都会回滚?

1 个答案:

答案 0 :(得分:0)

您需要查看two phase commits。基本上,这允许您在每个单独的系统上进行试验提交,然后只有当两个成功完成最终的“真正”提交时才会进行。

你还需要处理以下情况:客户崩溃了。然后你就会准备好挂起的东西,你会想要回滚它们并重新开始。