2016-03-21 2 views
0

問題は、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); 

答えて

1

シーケンスが既にインクリメントした後にトランザクションが最も可能性の高い中止されました:

コードは次のように基本的に見えます。これは、データベースの観点からは問題ではありません。自動インクリメントされた列は、そこにすべてのIDを順番に持つ必要はありません。コード/ユーザーの観点からも、これは問題ではありません。あなたのコードが継続的なIDを必要とする場合(監査目的のために言う)、あなた自身のためのシステムを実装する必要があります。必要がない場合は、トランザクションをもう一度実行してください。それはid 103(あなたの場合)を作成します。

+0

基本的に問題は、クライアントがサーバーからの応答を得て、すべてがOKであり、彼がチケットを得たことでした。しかし、そのチケットはサーバー上に存在せず、存在しません。だから私はシーケンシャルIDは必要ありません。私はちょうどスキップされたIDは挿入時にmysqlが行をスキップしたという証拠であり、例外をスローしなかったと言っています。 – madeye

+0

あなたのコードはトランザクション状態をチェックしなかったようです:このトランザクションを実行するコードを追加できますか? –

+0

私の質問をコードで更新しましたが、これがかなり基本的なものに役立つかどうかはわかりません。 – madeye

関連する問題