Python 如何使用SQLAlchemy处理两阶段提交
我正在尝试使用SQLalchemy 0.6.8和Postgresql 8.3.4进行两阶段提交,但我想我遗漏了一些东西…Python 如何使用SQLAlchemy处理两阶段提交,python,postgresql,sqlalchemy,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)
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
session = sessionmaker(engine)(twophase=True)
session.connection().commit_prepared(xid, recover=True)
这不会引起任何错误,但也不会向表中写入任何内容。。。欧欧欧
我错过了什么
在执行
prepare()
并从pgadmin发出COMMIT-PREPARED'xid'
后,我甚至试图阻止该应用程序,但仍然没有写入任何内容。我成功地使其工作,以下是方法:
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)(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
session = sessionmaker(engine)(twophase=True)
session.connection().commit_prepared(xid, recover=True)
如果您正在刷新和自动提交,两阶段会话应该如何工作?此外,会话在内部使用事务。您使用的是两种不同的抽象级别吗?如果禁用autocommit,则对connection()的调用会发出“BEGIN(implicit)”命令,然后BEGIN_twophase会引发“当事务已在进行时,无法启动两阶段事务”。。。我将尝试跳过刷新,虽然跳过刷新不会改变任何事情:(我应该使用sessionmaker(twophase=True)吗?您是否尝试过为每个会话使用不同的变量名?