0

我在 server1、server2、server3 上有三个 php 脚本。我有带有数据库“watch”的远程mysql server4 - 带有一列“data”的表“mytable”

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

  1. 选择“数据”列的第一行
  2. 使用数据进行操作
  3. 删除“数据”列的第一行
$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 值“迈克尔”。

“data”的第三行包含 uniq 值“George”。

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

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

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

4

2 回答 2

4

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

$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);
于 2012-09-06T07:42:00.120 回答
1

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

请不要忘记解锁表,尝试捕获您可能遇到的每个异常,否则表可能会被锁定很长时间。

于 2012-09-06T07:27:31.963 回答