すべてのフィールドを更新する場合もあれば、1 つを除くすべてのフィールドを更新する場合もある mySQL 更新クエリがあります。
呼び出しの約 10% で失敗しています。
私のテーブルは次のとおりです。
CREATE TABLE IF NOT EXISTS `grades` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`state` int(1) NOT NULL,
`result` varchar(255) NOT NULL,
`date_synced` datetime NOT NULL,
`updated_at` datetime NOT NULL,
PRIMARY KEY (`id`) )
ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=4395 ;
私のクエリは次のとおりです。
$sqlstr = "UPDATE grades SET result = '$result', state = 2, date_synced = '$date', updated_at = '$date' WHERE id = $id";
失敗すると、結果、date_synced、および updated_at が更新されますが、状態は変更されません。
状態フィールドのみを更新する別のクエリがあり、そのクエリも断続的に失敗します。
テスト環境では問題を再現できませんでした。実稼働の mySQL データベースに何か問題があるのでしょうか、それともロックの衝突のようなものでしょうか?
もっと情報があります。私はmysqliを使用しています。状態のみを更新する他のクエリは、mysql を使用しています。それは問題を引き起こしますか?
InnoDB は行ごとにロックされていると思いました。部分的な行の更新は許可されていませんね。
コメントに対処するための別の更新。
私のコード フローはかなり直線的です。
The row is created with state=0.
<flash stuff here> and the row is updated with state=1
A cron job pulls all state=1 and sends an api call
if api call is successful, the row is updated with state=2, result, date_synced, and updated_at
if api call is error, the row is updated with state=3, result, and updated_at
状態フィールドが 0 (フラッシュ後) または 1 (API 呼び出し後) に戻されることはありません。date _synced と result が設定されていますが、(時々) state がまだ 1 であるため、state フィールドへの更新がドロップされているようです。
更新トリガーを追加して、詳細情報が得られるかどうかを確認します。