Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何并行更新MySQL(MyISAM)表?_Mysql_Bash_Concurrency_Parallel Processing - Fatal编程技术网

如何并行更新MySQL(MyISAM)表?

如何并行更新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/

我有一个带有多个线程的并行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


事先谢谢你

Arman.

您可以实现锁定,但这会破坏拥有多个线程的目的。MyISAM只支持表级锁定,因此一次只有一个线程能够修改表

如果可以,请在字段上放置唯一索引或主键。请执行插入。。。在重复密钥更新时。。。MySql将确保操作是原子的


对于多线程/处理,我通常做的是让第一个线程/进程获得需要执行的所有作业的“列表”,然后创建一个线程/分支来处理每个作业或批作业。父线程/进程将确保子线程不会尝试执行相同的操作。我不确定这是否适用于您的情况。

谢谢,我正在设法为每个线程写入/更新唯一记录,例如:线程1只管理以1?开头的文件,线程2只管理文件2?,只是我想知道的是,如果每个线程都写入同一个表,这不危险吗?不,数据库处理任何争用问题。数据库就是这样做的。任何插入、更新或删除操作都会自动执行所需的锁定。