MySQL来自命令行 - 我几乎可以使用LOCK吗?

Ror*_*ory 8 mysql bash shell locking

我正在使用mysql命令行程序执行与MySQL数据库交互的bash脚本.我想在我的SQL中使用表锁.我可以这样做吗?

mysql -e "LOCK TABLES mytable"
# do some bash stuff
mysql -u "UNLOCK TABLES"
Run Code Online (Sandbox Code Playgroud)

我问的原因是,因为表锁只保留在会话中,所以一旦mysql程序完成就不会释放锁吗?

NVR*_*RAM 8

[编辑]

nos有一个基本的想法 - 只运行一次"mysql",并且提供的解决方案应该可以工作,但它将FIFO保留在磁盘上.

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

也就是说,您不需要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}
Run Code Online (Sandbox Code Playgroud)

另一种选择可能是将文件描述符分配给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}
Run Code Online (Sandbox Code Playgroud)

请注意,有一些控制问题:

  • 此代码没有错误检查没有锁定(或"其他东西"中的任何SQL命令).这绝对不是一件轻而易举的事.
  • 由于在第一个示例中,"其他内容"在子shell中,因此您无法轻松地从该上下文设置脚本的返回代码.