問題は、mysqlがサーバ上のCPU上で実行されており、それが約15分間続きました。その時、サーバーに来ていたデータの一部はdbに挿入されずにトランザクションがコミットされました。新しいレコードを挿入するときにMySQLが行をスキップしました
再起動後、mysqlの問題が解決されました。
これは、コミットされたトランザクションがテーブルに新しい行がなかったとしても、つまり、このための証拠は、このように見えたはずです自動インクリメントの主キーである:
100
101
102
しかし、現在、このようなものです:
100
102
ので、レコード101が存在しないとそのスキップされました。
ここで、そのレコードが存在する場合は、そのレコードのログを探す必要があります。
mysqldump log
で試しましたが、そこにはレコードがありません。レコード101はまだ失われています。
このトランザクションを再作成してもう一度やり直す方法を見つける必要があります。
誰にも同様の問題がありましたか?
$db->autocommit(FALSE);
$sql = "INSERT INTO t (amount, datetime) VALUES ($amount, '$datetime')";
$db->query($sql);
$id = $db->insert_id;
$sql = "INSERT INTO tr (id, log) VALUES ($id, '$log')";
$db->query($sql);
$db->autocommit(TRUE);
基本的に問題は、クライアントがサーバーからの応答を得て、すべてがOKであり、彼がチケットを得たことでした。しかし、そのチケットはサーバー上に存在せず、存在しません。だから私はシーケンシャルIDは必要ありません。私はちょうどスキップされたIDは挿入時にmysqlが行をスキップしたという証拠であり、例外をスローしなかったと言っています。 – madeye
あなたのコードはトランザクション状態をチェックしなかったようです:このトランザクションを実行するコードを追加できますか? –
私の質問をコードで更新しましたが、これがかなり基本的なものに役立つかどうかはわかりません。 – madeye