-2

任何人都可以使用 2 个 php 脚本测试 mysql 表锁。和 mysql_query()。

我试了一天,但我无法锁定桌子。

我希望当一个 php 脚本使用 mysql 表时,所有其他脚本都无法访问它。

您能否提供 2 个经过简单测试的 php 脚本。如果你能展示他们是如何在线工作的,那就太完美了。

但应该是这样,当第一个脚本工作并锁定 mysql 表时,其他脚本应该等待轮到它。

就像队列一样,只有一个脚本可以同时访问 myisam mysql 表。但是请在回答之前测试您的脚本,因为我尝试了很多建议但没有任何效果。

4

3 回答 3

1

您不使用 PHP 锁定表。您确实使用 mysql 查询锁定。所以基本上你用mysql docs中描述的语法进行查询,就是这样。例如:

mysqli_query("LOCK TABLES my_table READ");

并放弃mysql_支持mysqli_PDO

于 2012-08-30T22:04:15.630 回答
1

有两种锁。一个是@WebnetMobile.com 发布的内容。

另一种称为咨询锁——你竖起一个标志,每个人都必须在被允许访问之前检查这个标志。您可以在任何需要它的地方检查标志。但优点是您可以根据需要精确调整锁定。

此外,使用 InnoDB,您可以锁定表的特定行,而无需锁定整个表。

见:http ://dev.mysql.com/doc/refman/5.0/en/innodb-locking-reads.html

于 2012-08-30T22:06:29.637 回答
1

如果不是为了在事务级别管理复杂的数据库逻辑,我不建议明确锁定数据库表。查询仍然会被发送出去,但由于锁而失败,或者更糟糕的是,其他事务由于在错误的时间获取锁而死锁。

因此,您喜欢在应用程序中破坏任何表面上的性能。

编辑:

http://dev.mysql.com/doc/refman/5.1/en/lock-tables.html

mysql 的文档详细说明了锁的操作方式。为使用它的会话获取锁,因此如果您希望您的会话无权访问某些表和别名,那么您希望锁定除您要拒绝会话访问的表之外的所有内容。

不确定您希望测试什么锁作为示例。

       define("READ_LOCK", 0)
       define("WRITE_LOCK",1) 
       function lock_on_to_tables ($Tables, $lockType=0)
       {
         $sql = "LOCK TABLES "
        foreach ($Tables as $table)
           $sql .=  $table . " ,";
         $sql = substr($sql, 0, -1); // cut off last comma
         $sql .= $lockType ? " WRITE" : " READ;
         mysqli_query($sql); // or pdo or whatever is in use.  
       }

解锁只是

  mysqli_query("UNLOCK TABLES") ;
于 2012-08-30T22:13:31.950 回答