2013-06-09 3 views
0
# I've set echo=True when doing create_engine, so I can see all the sql stmt 
# DBSession is ScopeSession(thread_local) and autocommit is False 
session = DBSession() 
session.add(somemodel) 
# 
try: 
    session.flush() 
    raise Exception() 
    session.commit() 
except SQLAlchemyError as e: 
    session.rollback() 
finally: 
    session.close() 

acording к SQLAlchemy документы:Почему Sqlalchemy Session.close не регистрирует «откат»?

The close() method issues a expunge_all(), and releases any transactional/connection 
resources. When connections are returned to the connection pool, transactional state is 
rolled back as well. 

Я ожидаю увидеть журнал "откат" при выполнении "session.close()"

+0

Почему? Транзакции не совершаются, если вы явно не указываете базе данных на фиксацию. Закрытие соединения с базой данных или запуск новой транзакции таким образом неявно откатываются назад. –

+0

транзакция также неявно начинается, но я вижу журнал «begin» – Tallmad

+0

Я говорю о уровне базы данных, а не уровне SQLAlchemy. SQLAlchemy начинает транзакцию явно там, заканчивая любые предыдущие транзакции. –

ответ

1

откат (или если он сконфигурирован, фиксация) что в пуле в настоящее время не участвует в регистрации, которую обычно выполняет Двигатель для событий фиксации/отката.

билет: http://www.sqlalchemy.org/trac/ticket/2752 был добавлен.

Edit: взглянул на это, и я думаю, что эта регистрация должна еще быть частью регистратора пула, а не двигатель, иначе вы получите много этого:

sqlalchemy.Engine: COMMIT 
sqlalchemy.Engine: ROLLBACK (via pool) 

Приложения действительно не должен» t придется слишком беспокоиться о откате пула вещей, потому что, если вы используете Session, вам действительно нужно позвонить commit() или rollback() прямо перед любой операцией close().

регистрация пула обычно включается create_engine("url", echo_pool='debug') или настраивается ведение журнала в пространстве имен sqlalchemy.pool.

Смежные вопросы