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

标签 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/ $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/

相关文章:

php - 测试/调试/修复 PHP 并发问题的工具?

java - 何时使用正确版本的单例线程安全实现?

MySql 查询 : Left Join

MySQL 事务未根据完整性约束违规异常进行隔离

mysql - 比较两个不同表中的两个列值并根据 24 小时周期计算差异

bash - 将 bash 参数列表转换为带引号的单个字符串

dictionary - Golang 多个计时器与 map+channel+mutex

php mysql 从数据库中检索上传的照片

bash - 如何在 Ubuntu 下处理 GNU Make 中的 shell 扩展?

linux - Find 返回 "find: .: Permission denied",但我没有搜索