0

具体来说,我需要begin在提交或回滚后调用吗?我看到一些提示新会话总是进入 begin状态的东西;但我想知道会话开始时发生的自动提交事务。

我什么时候必须发出begin? 同一会话中的多个begins 的行为是否与 MySQL 终端中的行为相同?

我有这样的案例(看评论):

--1 在循环中执行事务的方法:

for ...: #EACH ONE DESERVES TO HAVE OWN TRANSACTION
  session.begin()
  for ....:
    session.execute("insert into...")
  session.commit()

--2 在同一会话中调用另一个函数的函数:

def f1(): #can be done standalone
  session = Session()
  session.begin()
  ...do stuff
  session.commit()

def f2():
  session = Session()
  session.begin()
  a = session.execute("select...")
  if stuff_not_fine():
    session.rollback() #KILL OF CURRENT TRANSACTION
    f1()
    session.begin() #CONTINUE WHERE IT LEFT
  a = session.execute("select...")
  ...do rest of stuff   
4

1 回答 1

0

SQL 连接也是一个上下文管理器。所以你可以做

session = Session()
with session as cursor:
    # do stuff

为了回滚,您可能会引入一个异常,如果引发该异常,则会导致上下文管理器回滚事务。但是,您应该记住捕获异常。

于 2012-10-11T09:54:43.473 回答