2012-09-11 29 views
6

Có ổn không khi sử dụng một kết nối MySQLdb duy nhất cho nhiều giao dịch mà không đóng kết nối giữa chúng? Nói cách khác, một cái gì đó như thế này:MySQLdb với nhiều giao dịch cho mỗi kết nối

conn = MySQLdb.connect(host="1.2.3.4", port=1234, user="root", passwd="x", db="test") 

for i in range(10): 
    try: 
     cur = conn.cursor() 
     query = "DELETE FROM SomeTable WHERE ID = %d" % i 
     cur.execute(query) 
     cur.close() 
     conn.commit() 

    except Exception: 
     conn.rollback() 

conn.close() 

Có vẻ như không sao, nhưng tôi chỉ muốn kiểm tra kỹ.

+0

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ì. –

Trả lời

15

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.

+0

Vâng, bạn nói đúng. Tôi vặn ví dụ của tôi trong khi tưới nó xuống để đăng nó. Tôi sẽ sửa nó. – d512

+0

Điều gì sẽ là vấn đề với việc chia sẻ kết nối giữa các luồng trong kịch bản của tôi? – d512

+2

@ user1334007: Từ [tài liệu MySQLdb] (http://mysql-python.sourceforge.net/MySQLdb.html): * "Nếu bạn để hai chủ đề sử dụng kết nối cùng một lúc, thư viện máy khách MySQL có thể sẽ upchuck và chết. Bạn đa được cảnh bao."*. –

0

Sẽ tốt hơn nếu bạn xây dựng chuỗi truy vấn đầu tiên và sau đó thực thi câu lệnh MySQL đơn. Ví dụ:

query = "DELETE FROM table_name WHERE id IN (" 
for i in range(10): 
    query = query + "'" + str(i) + "', " 
query = query[:-2] + ')' 

cur = conn.cursor() 
cur.execute(query) 
+0

Đó là hiệu quả hơn, nhưng có những lý do tại sao tôi không làm theo cách đó. – d512

+0

Alight, chỉ cần kiểm tra. –

Các vấn đề liên quan