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