Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2012/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何使用SQLAlchemy处理两阶段提交_Python_Postgresql_Sqlalchemy - Fatal编程技术网

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

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(

我正在尝试使用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
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)吗?您是否尝试过为每个会话使用不同的变量名?