来自命令行的 MySQL - 我可以实际使用 LOCKs 吗?

标签 mysql bash shell locking

我正在编写一个 bash 脚本,该脚本使用 mysql 命令行程序与 MySQL 数据库进行交互。我想在我的 SQL 中使用表锁。我可以这样做吗?

mysql -e "LOCK TABLES mytable"
# do some bash stuff
mysql -u "UNLOCK TABLES"

我问的原因是因为表锁只为 session 保留,所以不会在 mysql 程序完成后立即释放锁吗?

最佳答案

[编辑]

nos 有基本的想法 -- 只运行“mysql”一次,并且提供的解决方案 nos 应该有效,但它在磁盘上留下了 FIFO。

nos 也是正确的,我搞砸了:一个简单的“echo X >FIFO”将关闭 FIFO;我记错了。我的(已删除)评论 w.r.t.时间不适用,抱歉。

也就是说,您不需要 FIFO,您可以使用进程间管道。查看我的旧 MySQL 脚本,其中一些与此类似,但您不能让任何命令写入 stdout(没有一些“exec”技巧)。

#!/bin/bash
(
  echo "LOCK TABLES mytable READ ;"
  echo "Doing something..." >&2
  echo "describe mytable;" 
  sleep 5
  echo "UNLOCK  tables;" 
) | mysql ${ARGUMENTS}

另一个选项可能是为 FIFO 分配一个文件描述符,然后让它在后台运行。这与 nos 所做的非常相似,但是“exec”选项不需要子 shell 来运行 bash 命令;因此将允许您在“其他内容”中设置“RC”:

#!/bin/bash
# Use the PID ($$) in the FIFO and remove it on exit:
FIFO="/tmp/mysql-pipe.$$"
mkfifo ${FIFO} || exit $?
RC=0

# Tie FD3 to the FIFO (only for writing), then start MySQL in the u
# background with its input from the FIFO:
exec 3<>${FIFO}

mysql ${ARGUMENTS} <${FIFO} &
MYSQL=$!
trap "rm -f ${FIFO};kill -1 ${MYSQL} 2>&-" 0

# Now lock the table...
echo "LOCK TABLES mytable WRITE;" >&3

# ... do your other stuff here, set RC ...
echo "DESCRIBE mytable;" >&3
sleep 5
RC=3
# ...

echo "UNLOCK TABLES;" >&3
exec 3>&-

# You probably wish to sleep for a bit, or wait on ${MYSQL} before you exit
exit ${RC}

请注意有几个控制问题:

  • 此代码没有针对锁定失败(或任何 SQL 命令 在“其他东西”中)。这绝对非常重要。
  • 因为在第一个例子中,“其他东西”在一个子 shell 中,你不能轻易 从该上下文设置脚本的返回码。

关于来自命令行的 MySQL - 我可以实际使用 LOCKs 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1324697/

相关文章:

python仍然无法插入数据库

linux - awk - 使用 printf 仅格式化一个输出字段?

java - 在 OSX 中运行 CMD 等效项?

php - SQL Buddy,mySQL LOAD DATA LOCAL INFILE 错误

javascript - AJAX PHP+MySQL - 选择框

MySQL SELECT 一切都变成一个大字符串(列和行)

java - 在 Android 上通过 java 代码运行 Shell 命令?

java - 尝试在 Java 中获取终端 $COLUMNS

linux - 如何在 Jenkins 管道脚本中使用 source 命令

linux - 查看进程/文件是否正在运行 linux