我有一个带有多个线程的并行 bash 脚本。每个线程检查记录是否存在然后更新值,否则插入新行。 我应该关心线程并发吗? 我应该锁定解锁表还是由 mysql 来处理?
我的更新通过命令行:
#get.sh script...
# set status Downloading
mysql -uroot -pmypass -ss -e "use filestatus; call changeStatus(\"$1/$2\", 1)"
rsync -ar rsync://user@server/$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。
先谢谢你
阿曼。
最佳答案
您可以实现锁定,但这将破坏拥有多个线程的目的。 MyISAM 仅支持表级锁定,因此一次只能有 1 个线程修改表。
如果可以,请在字段上放置唯一索引或主键。执行 INSERT ... ON DUPLICATE KEY UPDATE ... 然后 MySql 将确保操作是原子的。
对于多线程/处理,我通常做的是让第一个线程/进程获得所有需要执行的作业的“列表”,然后创建一个线程/fork 来处理每个作业或一批作业.父线程/进程将确保子进程不会尝试做同样的事情。我不确定这是否适用于您的情况。
关于mysql - 如何并行更新 MySQL(MyISAM) 表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4767834/