簡體   English   中英

當多個線程正在寫入mysql中的單個表時會發生什么?

[英]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 249threadsafety屬性的含義如下:

0-線程可能無法共享該模塊。

1-線程可以共享模塊,但不能共享連接。

2-線程可以共享模塊和連接。

3-線程可以共享模塊,連接和游標。

在上述上下文中共享意味着兩個線程可以使用資源,而無需使用互斥量信號量包裝資源來實現資源鎖定。 請注意,您無法始終通過使用互斥鎖管理訪問來確保外部資源線程安全:該資源可能依賴於全局變量或您無法控制的其他外部源。

在您的示例中,您有共享單個連接的線程。 沒有任何明確的資源鎖定。 這很容易導致線程問題,並且您觀察到的症狀(線程鎖定)並非意外。

此示例中的簡單解決方案是為每個線程提供自己的連接對象。

(如果線程數很大,建議您使用一個並發連接數受限制的連接池。DB服務器將限制一個客戶端可以打開的連接數……到丈夫服務器端此外,在某個時候您將使用所有特定的服務器端資源;例如,CPU,內存,磁盤帶寬,網絡帶寬。除此之外,添加更多的客戶端線程不會增加吞吐量。)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM