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'
を発行しようとしましたが、何も書き込まれません。
どのように2つの相のセッションは、あなたがフラッシュし、オートコミットしている場合に動作することになっていますか?また、セッションは内部的にトランザクションを使用します。 2つの異なる抽象化レベルを使用していますか? –
自動コミットを無効にすると、connection()の呼び出しで「BEGIN(暗黙的)」が発行され、begin_twophaseによって「トランザクションがすでに進行中のときに2段階トランザクションを開始できません」というメッセージが表示されます。 – Joril
フラッシュをスキップしても何も変わりません:(私はsessionmaker(twophase = True)を使うべきですか? – Joril