2012-10-11 30 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,你可能會引入一個例外,如果上調,使上下文管理器回滾事務。但是,您應該記住要抓住例外。

相關問題