gpt4 book ai didi

python - 交易中的交易

转载 作者:太空狗 更新时间:2023-10-29 20:40:11 25 4
gpt4 key购买 nike

我想知道在另一个内部打开一个事务是否安全且值得鼓励?

我有一个方法:

def foo():
session.begin
try:
stuffs
except Exception, e:
session.rollback()
raise e
session.commit()

以及在交易中调用第一个方法的方法:

def bar():
stuffs
try:
foo() #<<<< there it is :)
stuffs
except Exception, e:
session.rollback()
raise e
session.commit()

如果我在 foo 方法上得到异常,所有操作都将是回滚?其他一切都会正常吗?谢谢!!

最佳答案

SQLAlchemy 中有两种嵌套事务的方法。一种是虚拟事务,其中 SQLAlchemy 跟踪您发出了多少个开始,并且仅在最外层事务提交时才发出提交。然而,回滚是立即发出的。因为事务是虚拟的——即数据库对嵌套一无所知,所以在回滚之后你不能对该 session 做任何事情,直到你也回滚所有外部事务。要允许使用虚拟交易,请将 subtransactions=True 参数添加到 begin() 调用。此功能的存在是为了允许您在函数内部使用事务控制,这些函数可能会相互调用而无需跟踪您是否在事务中。为了使其有意义,请使用 autocommit=True 配置 session ,并始终在事务函数中发出 session.begin(subtransactions=True)

嵌套事务的另一种方法是使用真正的嵌套事务。它们是使用保存点实现的。如果回滚一个嵌套事务,则在该事务内所做的所有更改都会被回滚,但外部事务仍然可用,并且外部事务所做的任何更改仍然存在。使用嵌套事务问题 session.begin(nested=True) 或只是 session.begin_nested()。并非所有数据库都支持嵌套事务。 SQLAlchemy 的测试套件库配置函数 sqlalchemy.test.requires.savepoints 说了这个支持:

    emits_warning_on('mssql', 'Savepoint support in mssql is experimental and may lead to data loss.'),
no_support('access', 'not supported by database'),
no_support('sqlite', 'not supported by database'),
no_support('sybase', 'FIXME: guessing, needs confirmation'),
exclude('mysql', '<', (5, 0, 3), 'not supported by database')

在 PostgreSQL 上,SQLAlchemy 嵌套事务工作得很好。

关于python - 交易中的交易,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2336950/

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