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

7 投票
1 回答
4174 浏览
提问于 2025-04-17 11:14

我正在尝试使用 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 个回答

7

我成功让它运行起来了,下面是我做的步骤:

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)

撰写回答