0

begin具体的には、コミットまたはロールバックを実行した後に呼び出す必要がありますか? 新しいセッションが常に 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   
4

1 に答える 1

0

SQL 接続は、コンテキスト マネージャーでもあります。だからあなたはすることができます

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

ロールバックするために、発生した場合にコンテキスト マネージャーがトランザクションをロールバックする例外を導入する場合があります。ただし、例外をキャッチすることを忘れないでください。

于 2012-10-11T09:54:43.473 に答える