mysql - 避免 Bash 脚本中的 MySQL 读取竞争条件

标签 mysql bash

我有一个将数据复制到外部磁盘的应用程序。复制请求存储在 MySQL 数据库中,并将从多个复制机读取,这些复制机运行 bash 脚本来获取请求。一旦请求被接收,它就会在数据库中被设置为“进行中”。但是,我试图避免多台机器同时读取请求并开始复制相同数据的情况。

我打算使用表锁定来执行此操作,但我很挣扎,因为当 session 过期时表锁就会过期,因此如果我这样做:

mysql="mysql -h dbhost -u user -pPassword diskcopydb"
echo "LOCK tables diskcopy WRITE;" | $mysql
echo "SELECT SQL_NO_CACHE * FROM diskcopy WHERE status=\"request\"" | $mysql

在获取请求时锁实际上已经过期,因此竞争条件仍然存在。这里有一个问题:

MySQL from the command line - can I practically use LOCKs?

其中 SQL 命令被打包到一个 block 中,并将它们一起通过管道传输到 MySQL,但我需要从中途获取 MySQL 的输出来接收请求。有人有这个的食谱吗?看起来它应该是一个相当常见的用例......

最佳答案

这个问题实际上在这里得到了回答:

Bulk insert of MySQL related tables from bash

换句话来说,使用 Bash 与 MySQL 进行双向通信会很棘手,而使用 Perl 或 Python 等“适当的”编程语言会更容易,您可以在其中打开和保持连接。

关于mysql - 避免 Bash 脚本中的 MySQL 读取竞争条件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12461344/

相关文章:

mysql - 在存储过程中传递参数

mysql - 如何在MySQL Workbench中自动更新数据库?

linux - Bash 脚本 : Syntax error in conditional expression

arrays - 将引用和未引用内容混合的文件读取到 bash 数组中,保留引号

java - 如何以编程方式在启动它的同一脚本中终止正在运行的进程?

php - 在 Google GeoChart 中使用 PHP 处理从数据库中获取的数据

mysql - 复杂的多列mysql order by

mysql - MySQL中的delete from table_a和truncate table table_a有什么区别?

bash - 如何在 shell 脚本中创建一个以 (-) 连字符作为其中字符之一的变量

bash - shell中 "${0##*[\\/]}"是什么意思?