首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >事务中的事务

事务中的事务
EN

Stack Overflow用户
提问于 2010-02-26 03:28:45
回答 3查看 7.9K关注 0票数 9

我想知道在另一个事务中打开事务是否安全和受鼓励?

我有一个方法:

代码语言:javascript
复制
def foo():
    session.begin
    try:
          stuffs
    except Exception, e:
         session.rollback()
         raise e
    session.commit()

以及一个在事务内调用第一个函数的方法:

代码语言:javascript
复制
def bar():
    stuffs
    try:
         foo()   #<<<< there it is :)
         stuffs
    except Exception, e:
        session.rollback()
        raise e
    session.commit()

如果我在foo方法上获得和异常,所有的操作都会被回滚吗?其他的一切都会很好吗?谢谢!!

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-02-26 05:44:36

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

嵌套事务的另一种方法是使用真正的嵌套事务。它们是使用保存点实现的。如果回滚嵌套事务,则会回滚在该事务中所做的所有更改,但外部事务仍然可用,并且外部事务所做的任何更改仍在那里。若要使用嵌套事务,请发出session.begin(nested=True)或仅使用session.begin_nested()。并非所有数据库都支持嵌套事务。SQLAlchemy的测试套件库配置函数sqlalchemy.test.requires.savepoints这样描述支持:

代码语言:javascript
复制
    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上,嵌套事务工作得很好。

票数 19
EN

Stack Overflow用户

发布于 2010-02-26 03:42:17

你不能,PostgreSQL并不支持子事务。您可能希望使用保存点,但这是另一回事。

票数 0
EN

Stack Overflow用户

发布于 2010-02-26 14:28:20

PostgreSQL上的

嵌套事务工作得很好。

嗯,你不会得到一个错误(只是一个警告),这是真的。但是您不能提交内部事务并回滚外部事务,外部事务也会回滚内部事务。

BEGIN;

插入到x(foo)值(‘John’);

开始;--警告!

INSERT INTO y(bar) VALUES('Jane');COMMIT;-- commit inserts ROLLBACK;--将回滚两个插入,而不仅仅是表"x“中的第一个插入。

据我所知,Oracle是少数几个拥有此选项的公司之一。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2336950

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档