2016-08-25 5 views
-3

Iveは、基本的に2つの異なる機能、つまりコードと同じ意味でトランザクションを実行しています。このコードは、MySQLを使用して完全にPHPで書かれています。トランザクション後にテーブル内で予期しないIDオフセットが発生する

insert_into_table1() 
{ 
    // transact start 
    // perform delete from table1 
    // insert into table from select statement from the database 
    // commit if done, else rollback 
} 

insert_into_table2() 
{ 
    // transact start 
    // perform delete from table2 
    // insert into table data from table1 after some processing (but same number of rows) 
    // commit if done, else rollback 
} 

上記の擬似コードの一例です。 最初は、表は空です。 コードの実行後に問題が発生します。両方のテーブルはN個の行で挿入されます。

コードを再度実行すると、テーブルはdeleteコマンド(MySQL)を使用して空になります。そして、N個の行が両方のテーブルに再び挿入されます。

しかし、2回目以降の実行では、 'id'(これは両方のテーブルのオフセット1でauto_incrementにあります。値が変更されないことを確認しました。)フィールドは、N + 1、 2番目のテーブルには10のオフセットがありますが、N + 1でも続ける必要があります。

この現象が発生する理由とその修正方法を知りたいと思います。

+6

私たちに何も言わない擬似定型コードではなく、実際のコードを見せてくれれば、理由や最終的なバグを見つけやすくなります。 –

+2

'rollback if done'なのは何もありませんコミットされている? – jedifans

+1

両方のテーブルに 'auto_increment'がありますか? 'truncate'ではなく' delete'を実行していますか? – Shaharyar

答えて

0

挿入すると、自動増分値が増加します。削除するとロールバックされません。

テーブルのTRUNCATEもリセットされますが、テーブル内のすべてのデータは失われます。

あなたのケースでは、最初は空の状態です...しかし、いつもそれを保証できますか?

+0

合意。削除するとロールバックされません。したがって、両方のテーブルは最後の増分値から継続する必要があります。これはtable1では発生しますが、table2では発生しません。そして、テーブル内で実行される他のアクションはありません。ちょうど削除と挿入。 したがって、このオフセットはまったくないはずです。しかし、オフセットがあります。 –

+0

'TRUNCATE'が実行されていない限り、auto_incrementは次の値から続行する必要がありますか?しかし何らかの理由で、table2にオフセットが表示されないようにしてください。 –

+0

おそらく、挿入するたびに最後のインサートIDを印刷してください。 – jedifans

関連する問題