9

すべてのフィールドを更新する場合もあれば、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 フィールドへの更新がドロップされているようです。

更新トリガーを追加して、詳細情報が得られるかどうかを確認します。

4

4 に答える 4

1

「{n} Rows Affected?」と表示されていますか?

また、繰り返し可能ですか。まったく同じデータに対して同じクエリを実行できますか?それは異なることを行いますか?

その場合、インストールが破損しているか、データベースが破損している可能性があります。

テーブルの修復と最適化を試してみましたか? それは助けになるかもしれません。

散々な回答で申し訳ありません:P

于 2013-01-08T23:21:15.937 に答える
0

MySQL の「厳格さ」を TRADITIONAL に再調整します。

SET sql_mode = 'TRADITIONAL';

PHPなしでコンソールから挿入してみてください。次に、それを説明できるエラーを確認します。

次のようにして、厳格さを「寛容」にリセットします。

SET sql_mode = '';

または、PDO オブジェクトを使用してデータベースに接続すると、PHP を介して次のようなエラーが返される場合:

try {
  $sqlstr = "UPDATE grades SET result = '$result', state = 2, date_synced = '$date',updated_at = '$date' WHERE id = $id";
$s = $pdo->exec($sqlstr);
}
catch (PDOException $e) {
  $error = $e->getMessage();
  echo $error;
}

基本的に、何が起こっているかのエラーメッセージを取得するために必要なことは何でもしてください。SQL がエラーを送信している可能性がありますが、PHP はスクリプトでエラーを表示するように設定されていません。

于 2013-02-13T01:17:45.953 に答える
0

フィールドの名前を「state」から「state_num」などの別の名前に変更してみてください。MySQL の予約語としてリストされていませんが、その名前が問題を引き起こしている可能性があります。

于 2013-02-15T23:50:08.137 に答える