- PR -

インクリメント(SQLSERVER)の更新について

1
投稿者投稿内容
さるさる
会議室デビュー日: 2006/03/09
投稿数: 2
投稿日時: 2006-03-09 11:22
お世話になっています。

さるさると申します。

SQLSERVER2000について質問があります。

テーブルを作成する時に
ID int IDENTITY(1,1)
としてSQLSERVERのインクリメントを使用しております。

そこで通常にデータをINSERTしていく場合、IDには自動連番が
振られていくのですが、サーバの負荷などでINSERTが失敗(時間切れなど)
してしまい、次にINSERTが成功するときにはIDには失敗された分だけ
IDがとんだ状態でINSERTされてしまいます。

特にINSERTに対してトランザクションでかこんでロールバックなどはしていないです。

INSERTが失敗して処理を取り消したのならなぜインクリメントの更新まで取り消してくれないのでしょうか?
そしてこのSQLSERVERのインクリメントが更新されるタイミングはいつなのでしょうか?

初心者的な質問かもしれませんが
おわかりになる方がいらっしゃいましたらご解答のほどよろしくお願いします
ue
ぬし
会議室デビュー日: 2005/05/07
投稿数: 581
お住まい・勤務地: 広島市
投稿日時: 2006-03-09 12:09
こんにちは。

こちらにID列についてのコラムがあります。
http://www.microsoft.com/japan/msdn/net/adonet/manidcrisis.asp

トランザクションのロールバックでもID値が孤立すると書いてありますから、データを追加するための行を確保(という表現は正しくないかも)した時点でID値はインクリメントしてしまい、その後にロールバックしようがエラーで弾かれようがそのID値は RESEED しない限り孤立するのではないでしょうか。

[ メッセージ編集済み 編集者: ue 編集日時 2006-03-09 12:10 ]
さるさる
会議室デビュー日: 2006/03/09
投稿数: 2
投稿日時: 2006-03-10 20:12
お早いご返答ありがとうございます。

そうですね。任意にトランザクションを使って、ロールバックをかけても
ID値が孤立してしまうということはトランザクションを使わなくても同じ
ことなんでしょうね。そしてID値がインクリメントされるのはINSERTしようと
したタイミングな気がしました。
そうしないとおそらくID値の競合等の不具合が考えられそうですから。

今回はID値を連番にしないといけないという問題ではないので
RESEEDは考えていないです。ちょっと怖いですし。

ありがとうございます。大変参考になりました。

1

スキルアップ/キャリアアップ(JOB@IT)