1

この関数の構造は次のとおりです。

$q = 'LOCK TABLES table1 WRITE;';
mysql_query($q);    
$q = 'select id from table1 where is_delete = 0 limit 1;';
$res = mysql_fetch_assoc(mysql_query($q));
if($res) {
$q = 'UPDATE table1 SET is_delete = 1 WHERE id = '".$res['id']."'';
mysql_query($q);
}
$q = 'UNLOCK TABLES;';
mysql_query($q);

すべてのテーブルをロックしていますが、クエリは並行して実行されます。これをどのように修正しますか?

4

1 に答える 1

0

LOCK TABLES クエリで MySQL エラーが発生しているかどうかを確認します。

$q = 'LOCK TABLES table1 WRITE';
$r = mysql_query($q) or die(mysql_error());    

ただし、これだけの場合は、単純に次のように書くこともできます

UPDATE `table1 SET `is_delete` = 1 WHERE `is_delete` = 0 LIMIT 1

ロックをまったく必要としません。is_deleteもちろん、これは、最初のクエリのデータがまったく処理されていない場合にのみ機能し、更新する行が0 に設定されている限り、どの行を更新するかは問題ではありません。これはあなたが投稿したコードも何をしますが、このコードを何に使用したいかはすぐにはわかりません:)

より一般的には、MySQL テーブルにデフォルトの InnoDB ストレージ エンジンを使用している場合は、SELECT ... FOR UPDATE を調べてください: http://dev.mysql.com/doc/refman/5.0/en/innodb- Locking-reads.html

あなたは書くことができます:

$q = 'select id from table1 where is_delete = 0 limit 1 for update';
$res = mysql_fetch_assoc(mysql_query($q));

if($res) {
   $q = 'UPDATE table1 SET is_delete = 1 WHERE id = '".$res['id']."'';
   mysql_query($q);
}

参照: http://www.mysqlperformanceblog.com/2006/08/06/select-lock-in-share-mode-and-for-update/

于 2012-04-16T19:34:20.113 に答える