Pythonを使用してMySQLに接続するためにMySQLdbを使用しています。私のテーブルはすべて InnoDB で、トランザクションを使用しています。
関数間でトランザクションを「共有」する方法を考え出すのに苦労しています。次の疑似コードを検討してください。
def foo():
db = connect()
cur = db.cursor()
try:
cur.execute(...)
conn.commit()
except:
conn.rollback()
def bar():
db = connect()
cur = db.cursor()
try:
cur.execute(...)
foo() # note this call
conn.commit()
except:
conn.rollback()
コードのいくつかのポイントで を呼び出す必要がfoo()
あり、いくつかのポイントで を呼び出す必要がありますbar()
。ここでのベストプラクティスは何ですか? 外部で呼び出されたが内部では呼び出されなかった場合、foo()
への呼び出しをどのように伝えますか? およびを呼び出す複数のスレッドがあり、 への呼び出しが同じ接続オブジェクトを返さない場合、これは明らかにより複雑になります。commit()
bar()
bar()
foo()
bar()
connect()
アップデート
自分に合った解決策を見つけました。connect()
呼び出されたときに値をインクリメントするようにラップしました。呼び出すcommit()
と、その値が減少します。が呼び出され、そのカウンターが > 0 の場合commit()
、コミットは行われず、値が減分されます。したがって、次のようになります。
def foo():
db = connect() # internal counter = 1
...
db.commit() # internal counter = 0, so commit
def bar():
db = connect() # internal counter = 1
...
foo() # internal counter goes to 2, then to 1 when commit() is called, so no commit happens
db.commit() # internal counter = 0, so commit