【问题标题】:Lock mysql table with php用php锁定mysql表
【发布时间】:2012-08-29 13:38:42
【问题描述】:

脚本 1.

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

脚本 2.

$query_ = "select * from test1";
$result = mysql_query($query_);

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

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

如何做到这一点?

【问题讨论】:

  • 这可能无助于回答您的问题,但您应该停止使用mysql_* 函数。它们正在被弃用。请改用PDO(PHP 5.1 起支持)或mysqli(PHP 4.1 起支持)。如果您不确定使用哪一个,read this article
  • 我相信该表只会针对那个特定的 mysql 连接实例被锁定。我认为这样可以防止出现竞争条件。
  • 为特定的 mysql 连接锁定它有什么意义?当我不插入任何东西时,为什么我的脚本要插入一些东西?
  • 也许我错了。也许我很困惑,我在想的是它实际上在脚本执行期间会自动锁定表以防止出现竞争条件......对不起,我在这里帮不上什么忙。

标签: php mysql locking


【解决方案1】:

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

LOCK TABLES test1 WRITE;

其他脚本不会返回错误,而是等待锁定被释放。

希望对你有帮助...

【讨论】:

  • 我试过了。仍然没有锁定任何东西。第二个脚本可以轻松访问数据。
  • 似乎从您的第一个脚本开始,首先您将写入锁放在 test1 上,然后执行查询,然后休眠 20 秒,然后解锁表。在您解锁之前,第二个脚本正在等待表解锁。一旦表解锁,第二个脚本中的查询就可以访问表并返回数据。尝试将睡眠时间增加到 100 或说 200,然后检查结果。
【解决方案2】:

read$query_ = "lock tables test1 as test11 read"; 锁定了表-这意味着其他查询仍然可以毫无问题地读取它(相关link-向下滚动到锁定类型部分):

read 锁类型的信息:

  • 持有锁的会话可以读表(但不能写)。
  • 多个会话可以同时获取表的 READ 锁。
  • 其他会话无需显式获取 READ 锁即可读取表。

如果您想停止任何事情,甚至是修改表格,您需要使用write 锁,如下所示:

$query_ = "lock tables test1 as test11 write";

【讨论】:

  • 我将修饰符更改为“写入”,第二个脚本仍然返回所有记录。
  • 检查我改写的例子。还是一样。一切正常。自己试一下,你会发现它不起作用。
  • @pain.reign 表上的锁是特定于会话的,这是一个任意的问题(这很酷)还是你试图在你锁定的表上模拟一个事务?
  • 我不明白你的问题。但是我尝试在一个事务中针对一个脚本进行所有查询并且没有事务。还是不行。 $query_ = "开始交易"; mysql_query($query_); $query_ = "将表 test1 锁定为 test11 写入"; mysql_query($查询); $query_ = "select * from test11";睡眠(20); $query_ = "解锁表"; mysql_query($query_); mysql_query("提交");
  • @still_dreaming_1 读锁将阻止任何会话在锁到位时写入表 - 尽管其他会话也可能同时获取读锁。从执行应用程序建立连接到连接终止(在代码中或代码完成执行时),会话一直保持在原位。
【解决方案3】:

您必须将锁表的权限授予 db 用户。

【讨论】:

    【解决方案4】:

    您对锁的作用有误解。锁不会阻止其他脚本访问数据,而是会影响其他脚本访问数据的时间。当脚本 2 尝试访问或修改由于锁定而不允许访问的数据时,它将暂停并等待锁定被释放。脚本 1 解锁表后,脚本 2 将继续执行并完成,没有任何问题。

    【讨论】:

      猜你喜欢
      • 2014-10-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-29
      • 2012-04-06
      相关资源
      最近更新 更多