2012-01-27 110 views
4

我正在嘗試使用SQLalchemy 0.6.8與Postgresql 8.3.4進行兩階段提交,但我認爲我錯過了一些東西......
工作流程像這樣:如何使用SQLAlchemy處理兩階段提交

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

如何兩相會話應該

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 

然後從另一個會話中工作,如果你正在沖洗和autocommitting?此外,會話在內部使用交易。你使用兩個不同的抽象層次? – 2012-01-27 18:02:08

+0

如果我禁用自動提交,對connection()的調用發出「BEGIN(隱式)」,然後begin_twophase提出「當事務已經在進行時無法啓動兩階段事務。」...我會嘗試跳過沖洗雖然 – Joril 2012-01-30 09:25:25

+0

跳過刷新不會改變任何東西:(我應該使用sessionmaker(twophase = True)嗎? – Joril 2012-01-30 09:49:17

回答

1

我設法得到它的工作,方法如下:

session = sessionmaker(engine)(twophase=True) 
session.connection().commit_prepared(xid, recover=True) 
相關問題