[解決済み] SQL ServerでのSELECT FOR UPDATE
質問
私は Microsoft SQL Server 2005 データベースを、分離レベル
READ_COMMITTED
と
READ_COMMITTED_SNAPSHOT=ON
.
では、使いたい。
SELECT * FROM <tablename> FOR UPDATE
...そのため、他のデータベース接続が同じ行にアクセスしようとするとブロックされます "FOR UPDATE"。
試してみました。
SELECT * FROM <tablename> WITH (updlock) WHERE id=1
...しかし、これは "1" 以外の ID を選択した場合でも、他のすべての接続をブロックします。
を行うための正しいヒントはどれでしょうか?
SELECT FOR UPDATE
を行うための正しいヒントはどれですか?
2009-10-03を編集。
これらは、テーブルとインデックスを作成するためのステートメントです。
CREATE TABLE example ( Id BIGINT NOT NULL, TransactionId BIGINT,
Terminal BIGINT, Status SMALLINT );
ALTER TABLE example ADD CONSTRAINT index108 PRIMARY KEY ( Id )
CREATE INDEX I108_FkTerminal ON example ( Terminal )
CREATE INDEX I108_Key ON example ( TransactionId )
多くの並列処理では、このように
SELECT
:
SELECT * FROM example o WITH (updlock) WHERE o.TransactionId = ?
2009-10-05を編集。
より良い概観を得るために、私は以下の表に試したすべての解決策を書き留めました。
メカニズム|異なる行ブロックのSELECT|同じ行ブロックのSELECT -----------------------+--------------------------------+-------------------------- ROWLOCK|いいえ|いいえ アップロック、ローロック|はい|はい xlock,rowlock(ロック、ロウロック)| yes(はい)| yes(はい repeatableread|no|no DBCC TRACEON (1211,-1) | yes | yes ローロック、エクスロック、ホールドロック アップロック、ホールドロック UPDLOCK,READPAST|no|no 探しています|いいえ|はい
どのように解決するのですか?
最近、私は デッドロック問題 が発生しました。Sql Server が必要以上にロックするためです (ページ)。これに対して本当に何もすることができません。今、私たちはデッドロック例外をキャッチしています...そして、私は代わりにOracleを持っていたかったです。
編集中です。 私たちは一方でスナップショット分離を使用しています。残念ながら、スナップショット分離を使用するためには、データベース サーバーによって許可される必要があります。現在ではデッドロック例外(もちろんまだ起こり得ます)だけでなく、バックグラウンド・プロセスからトランザクションを繰り返すスナップショット並行性問題(これはユーザが繰り返すことはできません)も発生しています。しかし、これはまだ以前よりはるかに良いパフォーマンスです。
関連
-
[解決済み] SQL Serverで実行中の合計を計算する
-
[解決済み] SQL ServerでSELECTからUPDATEする方法とは?
-
[解決済み] SQL Server テーブルにカラムが存在するかどうかを確認する方法は?
-
[解決済み] SQL Server の DateTime データ型から日付だけを返す方法
-
[解決済み] SQL ServerにおけるLEFT JOINとLEFT OUTER JOINの比較
-
[解決済み] SQLのSELECTでIF...THENを実行するにはどうすればよいですか?
-
[解決済み] SQL ServerでJOINを使用してUPDATE文を実行するにはどうすればよいですか?
-
[解決済み] SQL Server にテーブルが存在するかどうかを確認する
-
[解決済み] SQL Server - 挿入された行のIDを取得するための最良の方法は?
-
[解決済み】SQL Serverで既存のテーブルにデフォルト値を持つカラムを追加する
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[エラー処理] [MySQL] [Err] 1241 - オペランドは 1 つのカラムを含む必要があります。
-
[解決済み] Oracle Trigger ORA-04098: トリガーが無効で、再バリデーションに失敗しました。
-
[解決済み] MySQLの「スキーマの作成」と「データベースの作成」 - 違いはあるのか?
-
[解決済み] UNIONとUNION ALLの違いは何ですか?
-
[解決済み] JOINとINNER JOINの違いについて
-
[解決済み] SQL Serverでストアドプロシージャ内のテキストを検索する
-
[解決済み] カラム名の変更 SQL Server 2008
-
[解決済み] mysqldumpで特定のテーブルをスキップする
-
[解決済み] PostgreSQLで一重引用符で囲まれたテキストを挿入する
-
[解決済み] SQL Serverで、ある日付より大きいすべての日付を照会するにはどうすればよいですか?