我在server1,server2,server3上有三个php脚本。 我有远程mysql server4与数据库“监视” - 表“mytable”与一列“数据”
所有这些脚本都连接到db“watch”表“watch”列“data”,并且所有脚本都执行相同的操作:
$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中运行,但来自不同的服务器。
两个或所有三个脚本是否可能选择第一行的相同值 “亚历克斯”?
我想避免两个或三个脚本同时选择第一行的相同值。
答案 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
请不要忘记解锁桌子,尽量抓住你可能遇到的每一个例外,或者长时间锁定桌子。