2013-05-03 10 views
5

テーブルに新しい行を挿入しようとすると、このトランザクションで例外が発生した場合、データはロールバックされます。SQLでロールバックが発生したときに自動インクリメントされたIDをリセットする方法

次回新しいエントリが正常に挿入されると、AutoIncrement idは次の値で更新されます。テーブル内に2つの結果的な一意のIDの間にギャップがあることを意味します。

この問題を解決する有効な方法はありますか? なし - 事前

+0

あなたはどのように** TRY、** – Luv

+4

catchブロックを使用する必要があり、これは最初の場所で "問題" とは? SQL Serverはこれを行いません。実際の問題のシナリオについては、[この回答](http://stackoverflow.com/a/2829097/1324345)と[this one](http://stackoverflow.com/a/2829328/1324345)を参照してください。あなたのIDに間違いがないことを絶対に必要とするならば、あなた自身のロジックを書く必要があります。そしてレコードを削除するときに何をすべきかを把握する必要があります。 – alroc

+4

克服すべき唯一の問題は、あなたの期待にあるものです。アイデンティティ列は不透明なブロブと考えるべきであり、単に一致するだけで、 'int'変数に格納することができます。これらの列に含まれる実際の*値*は可能な限り無視してください。 –

答えて

12

おかげで答えが言ったことがあります。

IDENTITYカラムの全体のアイデアはではなく、トランザクションには無関心であるため、ロールバックされていない他のトランザクションを気にせずに数字を表示することができます。コミットするかどうかを決定するために、各トランザクション(挿入)ごとに10秒間、1000インサート/秒システムが停止したとします。 (fyi 10ms * 100 = 1s)

注:SQL Server 2012(最新のSP /執筆時のパッチレベル)には、IDに関連するon Connectと記載されている「機能」があります。

も前であっても2012年に、あなたもにロールバックする必要はありませんIDENTITY値を消費する - 例えば、これは、同じ理由で、他の主要なRDBMSに適用され、ここでhttps://stackoverflow.com/a/16156419/573261


を見ます

PostgreSQL sequences

重要:同じシーケンスから数値を取得する同時実行トランザクションをブロックしないようにするには、NEXTVAL操作はロールバックされることはありません。つまり、一度値がフェッチされると、後でnextvalを実行したトランザクションが中止されたとしても、値が使用されたとみなされます。つまり、中止されたトランザクションは、未使用の「穴」を割り当てられた値の順序で残す可能性があります。

(強調鉱山)

+0

私は99.9%のMySQLまたはPostgreSQLが失敗した場合、それらは両方とも#ロールバックします。なぜSQL Serverはこれを行うことができないのか分かりませんが、それは可能です。 – Phill

+0

@Phill PostgreSQLについて編集された回答の注記を参照してください – RichardTheKiwi

+0

私は同意します。単純な「select mySequence.NextValをデュアルから行う」;値を「使い切って」しまいます。やってみて。あなたのoracle世界でこのクエリーを3回実行してください。 – granadaCoder

関連する問題