如何使用SQLAlchemy处理两阶段提交

时间:2012-01-27 16:34:39

标签: python postgresql sqlalchemy

我正在尝试使用SQLalchemy 0.6.8与Postgresql 8.3.4进行两阶段提交,但我认为我遗漏了一些东西......
工作流程如下:

session = sessionmaker(engine)(autocommit=True)
tx = session.connection().begin_twophase(xid) # Doesn't issue any SQL
session.begin()
session.add(obj1)
session.flush()
tx.prepare()

然后从另一个会话

session = sessionmaker(engine)(autocommit=True)
session.connection().commit_prepared(xid, recover=True) # recover=True because otherwise it complains that you can't issue a COMMIT PREPARED from inside a transaction

这不会引发任何错误,但不会向表中写入任何内容... O_o 我错过了什么?

我尝试在prepare()之后阻止应用程序并从pgadmin发出COMMIT PREPARED 'xid',但仍然没有写入任何内容。

1 个答案:

答案 0 :(得分:1)

我设法让它工作,这是如何:

session = sessionmaker(engine)(twophase=True)
session.add(obj1)
session.prepare()
# Find transaction id
for k, v in s.transaction._connections.iteritems():
   if isinstance(k, Connection):
      return v[1].xid

然后从另一个会话

session = sessionmaker(engine)(twophase=True)
session.connection().commit_prepared(xid, recover=True)