ここでトランザクションを構成するものについて誤解があると思います。
この例では、1つの接続を開き、1つを実行します。 その上でのトランザクション。そのトランザクションで複数のSQLステートメントを実行しますが、コミット後に完全に閉じます。もちろん、それで十分です。
複数のトランザクションの実行 (SQLステートメントだけではなく)次のようになります:
conn = MySQLdb.connect(host="1.2.3.4", port=1234, user="root", passwd="x", db="test")
for j in range(10):
try:
for i in range(10):
cur = conn.cursor()
query = "DELETE FROM SomeTable WHERE ID = %d" % i
cur.execute(query)
cur.close()
conn.commit()
except Exception:
conn.rollback()
conn.close()
上記のコードは、それぞれが10個の個別の削除ステートメントで構成される10個のトランザクションをコミットします。
はい。スレッド間で接続を共有しない限り、開いている接続を問題なく再利用できるはずです。
たとえば、 SQLAlchemy 接続をプールして再利用し、必要に応じて開いている接続をアプリケーションに渡します。新しいトランザクションと新しいステートメントは、アプリケーションがシャットダウンされるまで閉じる必要なしに、アプリケーションの存続期間を通じてこれらの接続で実行されます。