Tôi nghĩ rằng có sự hiểu lầm về những gì cấu thành một giao dịch ở đây.
Ví dụ của bạn mở ra một kết nối, sau đó thực thi một giao dịch trên đó. Bạn thực hiện nhiều câu lệnh SQL trong giao dịch đó, nhưng bạn đóng nó hoàn toàn sau khi cam kết. Tất nhiên, điều đó còn tốt hơn cả.
Thực hiện nhiều giao dịch (trái ngược với chỉ các câu lệnh SQL), trông giống như sau:
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()
Đoạn mã trên thực hiện 10 giao dịch, mỗi giao dịch bao gồm 10 câu lệnh xóa riêng lẻ.
Và có, bạn sẽ có thể sử dụng lại kết nối đang mở cho điều đó mà không gặp sự cố, miễn là bạn không chia sẻ kết nối đó giữa các luồng.
Ví dụ: SQLAlchemy tái sử dụng các kết nối bằng cách gộp chúng lại, cung cấp các kết nối mở khi cần thiết cho ứng dụng. Các giao dịch mới và các câu lệnh mới được thực hiện trên các kết nối này trong suốt thời gian tồn tại của ứng dụng mà không cần phải đóng cho đến khi ứng dụng bị tắt.