如何用php锁定mysql myisam表

时间:2012-08-30 22:01:38

标签: php mysql

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

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

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

你能提供2个经过简单测试的PHP脚本吗?如果你能展示他们如何在网上工作,那将是完美的。

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

与队列一样,只有一个脚本可以同时访问myisam mysql表。但请在回答之前测试你的脚本,因为我尝试了许多建议并且没有任何作用。

3 个答案:

答案 0 :(得分:1)

你没有用PHP锁定表。你用mysql查询锁定。所以基本上你用in mysql docs所描述的语法进行查询就是这样。例如:

mysqli_query("LOCK TABLES my_table READ");

放弃mysql_,转而使用mysqli_PDO

答案 1 :(得分:1)

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

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

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

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

答案 2 :(得分:1)

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

因此,您希望在应用程序中表现出任何表现。

编辑:

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") ;