我想知道在另一个事务中打开事务是否安全和受鼓励?
我有一个方法:
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方法上获得和异常,所有的操作都会被回滚吗?其他的一切都会很好吗?谢谢!!
发布于 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这样描述支持:
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上,嵌套事务工作得很好。
发布于 2010-02-26 03:42:17
你不能,PostgreSQL并不支持子事务。您可能希望使用保存点,但这是另一回事。
发布于 2010-02-26 14:28:20
PostgreSQL上的
嵌套事务工作得很好。
嗯,你不会得到一个错误(只是一个警告),这是真的。但是您不能提交内部事务并回滚外部事务,外部事务也会回滚内部事务。
BEGIN;
插入到x(foo)值(‘John’);
开始;--警告!
INSERT INTO y(bar) VALUES('Jane');COMMIT;-- commit inserts ROLLBACK;--将回滚两个插入,而不仅仅是表"x“中的第一个插入。
据我所知,Oracle是少数几个拥有此选项的公司之一。
https://stackoverflow.com/questions/2336950
复制相似问题