flask_sqlalchemy如何控制嵌套子事务


#1


session.begin(subtransactions=True),可以解决子事务,但只能最多一个子事务
如:

with db.auto_commit_db(scoped_session=True) as s:
 s.add(user1)
 with db.auto_commit_db() as s2:
  s2.add(user2)
 raise MyError(code=122, msg='出错错了')

其中只有s2一个子事务,抛出异常时,s,s2都可以回滚,但如果这样:

with db.auto_commit_db(scoped_session=True) as s:
 s.add(user1)
 with db.auto_commit_db() as s2:
  s2.add(user2)
 with db.auto_commit_db() as s3:
  s3.add(user3)
 raise MyError(code=122, msg='出错错了')

有两个或两个以上时,子事务就无效了,有什么解决办法吗


#2

请为代码块设置语法高亮,使用编辑器上面的按钮,或是参考论坛说明里的编辑器使用一节

纯代码请用代码块给出。


#3

子事务控制用nested,如:

with db.auto_commit_db() as s:
 s.add(user1)
 with db.auto_commit_db(nested=True) as s2:
  s2.add(user2)
 with db.auto_commit_db(nested=True) as s3:
  s3.add(user3)
 raise MyError(code=122, msg='出错错了')

这样的话,抛出异常,s, s2, s3 都可以回滚