2012-10-11 31 views
0

具体来说,我需要在提交或回滚之后调用begin吗?我看到的东西暗示新会话总是进入begin状态;但是我想知道会话开始时发生的自动提交事务。我们是否需要明确地做session.begin()?

何时必须发出begin?同一会话中的多个begin会与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 

回答

0

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

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

为了的roolback,你可能会引入一个例外,如果上调,使上下文管理器回滚事务。但是,您应该记住要抓住例外。

相关问题