QA@IT

スナップショット分離でエラー

3124 PV

会社のツールでSQLServer2000+Tomcatで出来ていたのを
2014にする役になり、折角なのでスナップショット分離に
していい事になりました。

すると、採番の処理
1.maxを得る
2.javaで1足す
3.insertする
でたまに、キーダブりで即、insert不可になりました。

前はラッチのロックでいーかんじに待ちになったのが、
スナップショット分離のせいで、古いmaxで楽観的に
insertしたせいだとは思いますが、

3.で失敗したら、成功するまで1.から繰り返しの一択で
間違えないでしょうか?

#この件は本当に何処にも書いていない。Oracleの怒りを
#買うからでしょうか。

回答

#この件は本当に何処にも書いていない。Oracleの怒りを
#買うからでしょうか。

SQLServerなのにOracleの怒りなんですか?

UPDLOCKヒントを使っても回避できない事象でしょうか?

http://msdn.microsoft.com/ja-jp/library/tcbchxcb(v=vs.110).aspx

また上記ページの最後の

アプリケーションで競合が多数発生する場合、スナップショット分離は適切な選択肢ではない可能性があります。ヒントの使用は、本当に必要な場合のみに制限する必要があります。アプリケーションは、ロック ヒントに常に依存する操作にならないように設計されている必要があります。

という説明の通り、スナップショット分離に適した設計になっているのかも参考にしてください。

編集 履歴 (0)
  • 有り難うございました。競合が多数では無いので、スナップショット分離で行きたいと思います。 -

念のため確認ですが、スナップショット分離とは、スナップショット分離レベルを使うことを言っていますか?
あるいはREAD_COMMITTED_SNAPSHOTオプションをONにするという意味でしょうか?
後者ならまあOracleイメージでいいですが、前者だと結構話が違いますので。
というか前者は結構特殊な状況で使うものです。

編集 履歴 (0)
  • Microsoft JDBC Driver 4.0 for SQL Serverからtype4のドライバを抽出して実現しました。
    あと、IIS8に合ったリダイレクタもなかったので、8080で勘弁してもらいました。
    大した処理はしない割に、締め時に多重ロックで固まってしまいがちなのの改善を期待しています。
    -
  • READ_COMMITTED_SNAPSHOT データベース オプションは、データベースプロパティの画面で常にonでした。
    帳票作成用ワークテーブルが簡単にテーブルロックになってしまう事がなくなり、快適です。
    -
ウォッチ

この質問への回答やコメントをメールでお知らせします。