Как обрабатывать двухфазный коммит с помощью SQLAlchemy - PullRequest
4 голосов
/ 27 января 2012

Я пытаюсь сделать двухфазный коммит, используя 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

Это не вызывает никакой ошибки, но и ничего не записывает в таблицу ... O_o Что мне не хватает?

Я пытался даже заблокировать приложение после prepare() и выдать COMMIT PREPARED 'xid' от pgadmin, но все равно ничего не пишется.

1 Ответ

1 голос
/ 15 февраля 2012

Мне удалось заставить его работать, вот как:

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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...