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)
4

1 に答える 1

6

SAVEPOINT が使用されていない限り (ここではそうではありません)、session.rollback() はネストに関係なくトランザクション全体をロールバックします。「サブトランザクション」でネストする目的は、コードのいくつかのブロックがそれぞれ、トランザクションを「begin()」および「commit()」するように指定できるようにすることです。これは、これらのメソッドの 1 つが他のメソッドを呼び出すかどうかに関係なく行われます。効果があるのは最も外側のbegin()/commit() ペアだけなので、ここのコードはmethod_b() に begin()/commit() 呼び出しがまったくないことと同等です。

「サブトランザクション」パターンは、主にフレームワークの統合を目的として存在し、一般的な使用を意図したものではありません。

于 2012-11-18T07:15:18.277 に答える