2011-01-22 69 views
1

我有一個與多個線程並行的bash腳本。每個線程檢查記錄是否存在,然後更新值,否則插入新行。 我應該關心線程併發嗎? 我應該鎖定解鎖表還是mysql照顧它?如何並行更新MySQL(MyISAM)表?

我去更新通過命令行:

#get.sh script... 
# set status Downloading 
mysql -uroot -pmypass -ss -e "use filestatus; call changeStatus(\"$1/$2\", 1)" 
rsync -ar rsync://[email protected]/$2/ $1/$2/ 
if [ $? -eq 0 ]; 
then 
# set status OK 
mysql -uroot -pmypass -ss -e "use filestatus; call changeStatus(\"$1/$2\", 0)" 
else 
# set status ERROR 
mysql -uroot -pmypass -ss -e "use filestatus; call changeStatus(\"$1/$2\", 2)" 
fi 

我叫幾個get.sh使用不同的參數。


預先感謝
Arman。

回答

2

你可以實現鎖定,但這將打敗擁有多個線程的目的。 MyISAM僅支持表級鎖定,因此一次只能有一個線程修改表。

如果可以,請在字段上添加唯一索引或主鍵。執行INSERT ... ON DUPLICATE KEY UPDATE ... MySql將確保該操作是原子操作。

我通常使用多線程/處理的方式是讓第一個線程/進程獲取需要執行的所有作業的「列表」,然後創建一個線程/叉來處理每個作業或一批工作。父母線程/進程將確保孩子們不會嘗試做同樣的事情。我不確定這是否適用於您的情況。

+0

謝謝,我正在管理寫/更新每個線程的唯一記錄例如:線程1只管理從1開始的文件,??? 2文件2 ???,只有我想知道的是,如果每個線程寫入相同表是不危險的? – Arman 2011-01-23 20:45:33