2011-01-22 34 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