如何并行更新MySQL(MyISAM)表?
我有一个带有多个线程的并行bash脚本。每个线程检查记录是否存在,然后更新值,否则插入新行。 我应该关心线程并发性吗? 我应该锁定解锁表还是mysql负责 我的更新通过命令行进行:如何并行更新MySQL(MyISAM)表?,mysql,bash,concurrency,parallel-processing,Mysql,Bash,Concurrency,Parallel Processing,我有一个带有多个线程的并行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/
#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
事先谢谢你
Arman.您可以实现锁定,但这会破坏拥有多个线程的目的。MyISAM只支持表级锁定,因此一次只有一个线程能够修改表 如果可以,请在字段上放置唯一索引或主键。请执行插入。。。在重复密钥更新时。。。MySql将确保操作是原子的
对于多线程/处理,我通常做的是让第一个线程/进程获得需要执行的所有作业的“列表”,然后创建一个线程/分支来处理每个作业或批作业。父线程/进程将确保子线程不会尝试执行相同的操作。我不确定这是否适用于您的情况。谢谢,我正在设法为每个线程写入/更新唯一记录,例如:线程1只管理以1?开头的文件,线程2只管理文件2?,只是我想知道的是,如果每个线程都写入同一个表,这不危险吗?不,数据库处理任何争用问题。数据库就是这样做的。任何插入、更新或删除操作都会自动执行所需的锁定。