首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从命令行使用MySQL -我可以实际使用锁吗?

从命令行使用MySQL -我可以实际使用锁吗?
EN

Stack Overflow用户
提问于 2009-08-24 20:50:08
回答 5查看 5K关注 0票数 8

我正在使用mysql命令行程序执行一个与MySQL数据库交互的bash脚本。我想在我的SQL中使用表锁。我能这么做吗?

代码语言:javascript
复制
mysql -e "LOCK TABLES mytable"
# do some bash stuff
mysql -u "UNLOCK TABLES"

我问的原因是,因为表锁只在会话期间保留,所以不是在mysql程序结束时就会释放锁吗?

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2009-08-25 00:36:50

编辑

mysql nos 有一个基本的想法--只运行"mysql“一次,提供的解决方案应该可以工作,但它把留在了磁盘上。

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

也就是说,您不需要FIFO,您可以使用进程间管道。查看我以前的MySQL脚本,有些脚本的工作方式与此类似,但您不能让任何命令写入标准输出()(没有一些"exec“技巧)。

代码语言:javascript
复制
#!/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”:

代码语言:javascript
复制
#!/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命令)。这绝对是non-trivial.
  • Since在第一个示例中,“其他东西”在一个子subshell中,您不能轻松地从该上下文设置脚本的返回代码。
票数 8
EN

Stack Overflow用户

发布于 2009-08-24 22:07:14

这里有一种方法,我相信还有一种更简单的方法。

代码语言:javascript
复制
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
票数 4
EN

Stack Overflow用户

发布于 2011-03-12 21:03:29

当我自己研究这个问题时,我发现了一个非常有趣的方法,就是使用MySQL的SYSTEM命令。我仍然不确定到底是什么缺点,如果有的话,但它肯定会在许多情况下工作:

示例:

代码语言:javascript
复制
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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1324697

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档