我有一个表需要锁定以防止插入,但它也需要能够在阻止插入时进行更新。

function myfunction() {
  $locked = mysql_result(mysql_query("SELECT locked FROM mylock"),0,0);
  if ( $locked ) return false;
  mysql_query("LOCK TABLES mylock WRITE");
  mysql_query("UPDATE mylock SET locked=1");
  mysql_query("UNLOCK TABLES");

  /* I'm checking another table to see if a record doesn't exist already */
  /* If it doesn't exist then I'm inserting that record */

  mysql_query("LOCK TABLES mylock WRITE");
  mysql_query("UPDATE mylock SET locked=0");
  mysql_query("UNLOCK TABLES");
}

但这还不够,该函数是从另一个脚本再次调用的,同时从对该函数的两个调用中进行插入,我不能这样做,因为这会导致重复记录。
有急事请帮忙。我想在字段上使用UNIQUE,但是有两个字段(player1,player2),并且两个字段都不能包含玩家ID的副本。
不需要的行为:
记录A=(播放1:123播放2:456)
记录B=(播放者1:456播放者2:123)

最佳答案

我刚刚注意到你的代码中有种族问题。假设没有错误(见我的评论)。。。两个进程可以检查并获得“未锁定”结果。“锁表”将序列化它们的访问,但它们都会继续认为自己拥有锁,从而复制记录。
你可以重写如下:

mysql_query("LOCK TABLES mylock WRITE");
mysql_query("UPDATE mylock SET locked=1 WHERE locked=0");
$have_lock = mysql_affected_rows() > 0;
mysql_query("UNLOCK TABLES");
if (!$have_lock ) return false;

关于php - PHP +锁定MySQL表失败,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11980650/

10-14 12:56
查看更多