競合状態を防ぐために次のコードを使用しても安全ですか?(key
およびstatus
フィールドとmysql_affected_rowsはロックを実装するために使用されます)
$mres = mysql_query("SELECT `values`, `key`, `status`
FROM `test`
WHERE `id` = 1");
$row = mysql_fetch_array($mres);
if($row['status'] != UPDATING) {
$mres = mysql_query("UPDATE `test` SET
`status` = UPDATING,
`key` = `key` + 1
WHERE `id` = 1 AND `key` = ".$row['key']);
if($mres && mysql_affected_rows()) {
//update here safely and then...
mysql_query("UPDATE `test` SET
`status` = NOT_UPDATING,
`key` = `key` + 1
WHERE `id` = 1");
}
}
私のテストでは、安全ではないか、コード内の隠れた間違いを検索する必要があることが示されています。テーブルはMyISAMです