2012-01-27 18 views
4

SQLAlchemy 0.6.8をPostgreSQL 8.3.4で使用して2フェーズコミットを実行しようとしていますが、私は何かが足りないと思っています...
ワークフローは進むこのように: は、私が何をしないのですO_O ...その後SQLAlchemyで2フェーズコミットを処理する方法

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 

これは、任意のエラーは発生しませんが、どちらかのテーブルには何も書き込みませんか?

prepare()の後にアプリケーションをブロックしても、pgadminからCOMMIT PREPARED 'xid'を発行しようとしましたが、何も書き込まれません。

+1

どのように2つの相のセッションは、あなたがフラッシュし、オートコミットしている場合に動作することになっていますか?また、セッションは内部的にトランザクションを使用します。 2つの異なる抽象化レベルを使用していますか? –

+0

自動コミットを無効にすると、connection()の呼び出しで「BEGIN(暗黙的)」が発行され、begin_twophaseによって「トランザクションがすでに進行中のときに2段階トランザクションを開始できません」というメッセージが表示されます。 – Joril

+0

フラッシュをスキップしても何も変わりません:(私はsessionmaker(twophase = True)を使うべきですか? – Joril

答えて

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) 
関連する問題