如何避免在mysql中同时选择第一行?

时间:2012-09-06 07:23:48

标签: php mysql

我在server1,server2,server3上有三个php脚本。 我有远程mysql server4与数据库“监视” - 表“mytable”与一列“数据”

所有这些脚本都连接到db“watch”表“watch”列“data”,并且所有脚本都执行相同的操作:

  1. 选择“数据”列的第一行
  2. 使用数据进行操作
  3. 删除“data”列的第一行
  4. $connect = mysql_connect("ip","user","password") OR DIE("Can't connect ");
                mysql_select_db("watch") or die("Can't select database");
        $xv=1
        do {
        $select = mysql_query("SELECT data FROM mytable LIMIT 1") or 
                   die("wrong select");
                 if (!$select) {
                 echo 'Could not run query: ' . mysql_error(); 
                 exit;}
                 $data = mysql_fetch_row($select);
        -----------
        operation with first row of "data" 
        -------------
    
        mysql_query("DELETE FROM mytable LIMIT 1") or die("wrong delete");
    
        } while ($xv++<100);
    

    例如,

    第一行“数据”包含uniq值“Alex”。

    第二行“数据”包含uniq值“Michael”。

    第三行“数据”包含uniq值“George”。

    PHP脚本同时在cron中运行,但来自不同的服务器。

      

    两个或所有三个脚本是否可能选择第一行的相同值   “亚历克斯”?

    我想避免两个或三个脚本同时选择第一行的相同值。

2 个答案:

答案 0 :(得分:4)

使用锁定,解锁表格。 LOCK TABLES显式获取当前客户端会话的表锁。 UNLOCK TABLES显式释放当前会话持有的任何表锁。另请阅读此link

$connect = mysql_connect("ip","user","password") OR DIE("Can't connect ");
mysql_select_db("watch") or die("Can't select database");

$xv=1
do {
    mysql_query("LOCK TABLES mytable WRITE");
    $select = mysql_query("SELECT data FROM mytable LIMIT 1") or die("wrong select");
    if (!$select) {
         echo 'Could not run query: ' . mysql_error(); 
         exit;
    }
    $data = mysql_fetch_row($select);

-----------
operation with first row of "data" 
-------------

    mysql_query("DELETE FROM mytable LIMIT 1") or die("wrong delete");
    mysql_query("UNLOCK TABLES");

} while ($xv++<100);

答案 1 :(得分:1)

我认为在mysql中,唯一的方法是在读或写之前锁定表。在这里你有链接: http://dev.mysql.com/doc/refman/5.0/en/lock-tables.html

请不要忘记解锁桌子,尽量抓住你可能遇到的每一个例外,或者长时间锁定桌子。