2012-09-11 21 views
6

可以在不關閉它們之間的連接的情況下爲多個事務使用單個MySQLdb連接嗎?換句話說,這樣的事情:每個連接有多個事務的MySQLdb

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() 

它似乎工作正常,但我只是想仔細檢查。

+0

太糟糕了,你沒有留下你的錯誤。在閱讀修訂之前,我真的很困惑,因爲我沒有看到Martijn Pieters在談論什麼是誤解。 –

回答

15

我認爲這裏有一個關於什麼構成交易的誤解。

您的示例打開一個連接,然後執行一個事務。您在該事務中執行多個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個人的delete語句。

是的,只要您不在線程之間共享該連接,您應該可以重新使用打開的連接,而不會出現任何問題。

例如,SQLAlchemy通過彙集連接來重新使用連接,並根據需要嚮應用程序提供開放連接。新事務和新語句在應用程序的整個生命週期中都在這些連接上執行,無需在應用程序關閉之前關閉。

+0

是的,你說得對。我把我的例子搞砸了,一邊澆水一邊把它貼出來。我會解決這個問題。 – d512

+0

在我的方案下線程之間共享連接會出現什麼問題? – d512

+2

@ user1334007:從[MySQLdb文檔](http://mysql-python.sourceforge.net/MySQLdb.html):*「如果讓兩個線程同時使用連接,MySQL客戶端庫可能會掛起並死亡。你被警告了。」*。 –

0

最好先構建一個查詢字符串,然後執行該單個MySQL語句。例如:

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

這樣做效率更高,但有些原因我沒有這麼做。 – d512

+0

對,只是檢查。 –