gpt4 book ai didi

python - 如何在 SQLAlchemy 中使用带范围 session 的嵌套事务?

转载 作者:太空狗 更新时间:2023-10-30 01:09:27 27 4
gpt4 key购买 nike

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

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

最佳答案

除非使用 SAVEPOINT,这里不是这种情况,否则 session.rollback() 回滚整个事务,而不管嵌套。嵌套“子事务”的目的是让几个代码块可以分别指定它们“开始()”和“提交()”一个事务,而不管这些方法中的一个是否调用另一个。只有最外层 begin()/commit() 对有任何影响,所以这里的代码相当于没有没有 begin()/commit() 调用在 method_b() 中。

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

关于python - 如何在 SQLAlchemy 中使用带范围 session 的嵌套事务?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13330245/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com