如何在SQLAlchemy中的作用域会话中使用嵌套事务?

pra*_*659 5 python transactions sqlalchemy python-2.7

我已经编写了下面的代码来处理整个应用程序中的嵌套事务。但是当它回滚一次之后,所有事务都会回滚,直到我重新启动应用程序为止。

# method_a starts a transaction and calls method_b
def method_a():
    session.begin(subtransactions=True)
    try:
        method_b()
        session.commit()  # transaction is committed here
    except:
        session.rollback() # rolls back the transaction


# method_b also starts a transaction, but when
# called from method_a participates in the ongoing
# transaction.
def method_b():
    session.begin(subtransactions=True)
    try:
        session.add(SomeObject('bat', 'lala'))
        session.commit()  # transaction is not committed yet
    except:
        session.rollback() # rolls back the transaction, in this case
                       # the one that was initiated in method_a().


# create a Session and call method_a
session = Session(autocommit=True)
global session
method_a(session)
Run Code Online (Sandbox Code Playgroud)

zzz*_*eek 5

除非正在使用SAVEPOINT(在这里不是这种情况),session.rollback()会回滚整个事务,而不管嵌套如何。嵌套“子事务”的目的是使几个代码块可以各自指定它们“开始()”和“提交()”事务,而与这些方法中的一个是否调用另一个无关。只有最外面的 begin()/ commit()对起作用,因此这里的代码等效于method_b()中根本没有 begin()/ commit()调用。

存在“子事务”模式主要是为了框架集成的目的,并不旨在用于一般用途。