我正在使用mysql命令行程序执行一个与MySQL数据库交互的bash脚本。我想在我的SQL中使用表锁。我能这么做吗?
mysql -e "LOCK TABLES mytable"
# do some bash stuff
mysql -u "UNLOCK TABLES"我问的原因是,因为表锁只在会话期间保留,所以不是在mysql程序结束时就会释放锁吗?
发布于 2009-08-25 00:36:50
编辑
mysql nos 有一个基本的想法--只运行"mysql“一次,提供的解决方案应该可以工作,但它把留在了磁盘上。
nos也是正确的,我搞砸了:一个简单的"echo X >FIFO“将关闭先进先出;我记错了。和我的(删除的)评论w.r.t.时间不合适,抱歉。
也就是说,您不需要FIFO,您可以使用进程间管道。查看我以前的MySQL脚本,有些脚本的工作方式与此类似,但您不能让任何命令写入标准输出()(没有一些"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“选项不需要子set来运行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}请注意,有几个控制问题:
发布于 2009-08-24 22:07:14
这里有一种方法,我相信还有一种更简单的方法。
mkfifo /tmp/mysql-pipe
mysql mydb </tmp/mysql-pipe &
(
echo "LOCK TABLES mytable READ ;" 1>&6
echo "Doing something "
echo "UNLOCK tables;" 1>&6
) 6> /tmp/mysql-pipe发布于 2011-03-12 21:03:29
当我自己研究这个问题时,我发现了一个非常有趣的方法,就是使用MySQL的SYSTEM命令。我仍然不确定到底是什么缺点,如果有的话,但它肯定会在许多情况下工作:
示例:
mysql <<END_HEREDOC
LOCK TABLES mytable;
SYSTEM /path/to/script.sh
UNLOCK TABLES;
END_HEREDOC值得注意的是,这只适用于*nix,显然是as does the SYSTEM command。
归功于丹尼尔·卡多什:http://dev.mysql.com/doc/refman/5.5/en/lock-tables.html#c10447
https://stackoverflow.com/questions/1324697
复制相似问题