[英]What happens when multiple threads are writing to a single table in mysql?
我正面臨着多個線程試圖將數據插入mysql中同一表的情況,**不用顯式處理就可以了嗎? **恐怕每個線程都在插入,某些線程將被鎖定並保持太長時間,然后導致程序損壞。
基本上我想做的是以下幾點:
import threading
import mysql.connector
db = mysql.connector.connect()
cursor = db.cursor()
def update_to_table(data):
sql = "insert into my_db.my_table values(%s)" % data
cursor.excute(sql)
db.commit()
print("update complete!")
for i in range(10):
print("%d -th time..." % i)
data = get_data(i)
t = threading.Thread(target=update_to_table, args=(data,))
t.start()
我是否需要檢查是否正在插入其他線程,並繼續等待直到它們完成等...
我不同的數據沒有重疊,因此我們不必擔心重復的密鑰問題。
經過實驗后,似乎某些線程將掛起並且沒有響應。
根據《 MySQL Connector / Python開發人員指南》 , mysql.connector.threadsafety
屬性為1
。
根據PEP 249 , threadsafety
屬性的含義如下:
0-線程可能無法共享該模塊。
1-線程可以共享模塊,但不能共享連接。
2-線程可以共享模塊和連接。
3-線程可以共享模塊,連接和游標。
在上述上下文中共享意味着兩個線程可以使用資源,而無需使用互斥量信號量包裝資源來實現資源鎖定。 請注意,您無法始終通過使用互斥鎖管理訪問來確保外部資源線程安全:該資源可能依賴於全局變量或您無法控制的其他外部源。
在您的示例中,您有共享單個連接的線程。 沒有任何明確的資源鎖定。 這很容易導致線程問題,並且您觀察到的症狀(線程鎖定)並非意外。
此示例中的簡單解決方案是為每個線程提供自己的連接對象。
(如果線程數很大,建議您使用一個並發連接數受限制的連接池。DB服務器將限制一個客戶端可以打開的連接數……到丈夫服務器端此外,在某個時候您將使用所有特定的服務器端資源;例如,CPU,內存,磁盤帶寬,網絡帶寬。除此之外,添加更多的客戶端線程不會增加吞吐量。)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.