用php锁定mysql表

pai*_*ign 6 php mysql locking

脚本1.

$query_ = "lock tables test1 as test11 write";
mysql_query($query);
$query_ = "select * from test11";
sleep(20);
$query_ = "unlock tables";
mysql_query($query_);
Run Code Online (Sandbox Code Playgroud)

脚本2.

$query_ = "select * from test1";
$result = mysql_query($query_);
Run Code Online (Sandbox Code Playgroud)

问题是如果我在运行第一个脚本时运行第二个脚本.表锁定.我可以从中读取任何数据.

我需要它被锁定并返回错误.

如何使这项工作?

jsi*_*ist 8

如果您不希望其他人访问该表,请使用

LOCK TABLES test1 WRITE;
Run Code Online (Sandbox Code Playgroud)

其他脚本不会返回错误,但会等到锁被释放.

希望能帮助到你...

  • 看来,从您的第一个脚本开始,首先是将写锁置于test1上,然后执行查询,然后休眠20秒,然后解锁表。在您解锁之前,第二个脚本正在等待表解锁。表解锁后,第二个脚本中的查询即可访问该表并返回数据。尝试将睡眠时间增加到100或说200,然后检查结果。 (2认同)

Flu*_*feh 6

你正在read锁定表$query_ = "lock tables test1 as test11 read";- 这意味着其他查询仍然可以读取它而没有任何问题(相关链接 - 向下滚动到锁类型部分):

关于read锁类型的信息:

  • 持有锁的会话可以读取表(但不能写入).
  • 多个会话可以同时获取表的READ锁.
  • 其他会话可以在不明确获取READ锁的情况下读取该表.

如果你想停止其他任何事情,那么你需要使用一个write锁,如下所示:

$query_ = "lock tables test1 as test11 write";
Run Code Online (Sandbox Code Playgroud)

  • @ still_dreaming_1读取锁定将阻止任何会话在锁定到位时写入表格 - 尽管其他会话也可能同时获取读取锁定.从执行的应用程序建立连接到终止连接的时间(在代码中或代码完成执行时),会话保持不变. (2认同)