問題タブ [isolation-level]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
sql - IsolationLevel.Snapshotを使用していますが、DBはまだロックされています
私は、ADO.NETベースのWebサイトを構築するチームの一員です。データベースの開発コピーを同時に動作させる複数の開発者と自動テストツールが存在する場合があります。
スナップショット分離レベルを使用します。これは、私の知る限り、楽観的同時実行性を使用します。ロックするのではなく、影響を受ける行が他のパーティによって変更された場合にトランザクションをコミットしようとすると、最高のものを期待して例外をスローします。トランザクション。
スナップショット分離レベルを使用するには、次を使用します。
およびC#の場合:
IsolationLevelスナップショットは、私たちも試したが現在使用していないReadCommittedスナップショットと同じではないことに注意してください。
開発者の1人がデバッグモードに入り、.NETアプリを一時停止すると、開発者はデバッグ中にアクティブなトランザクションとの接続を保持します。さて、これは問題ではないと思います-結局のところ、すべてのトランザクションはスナップショット分離レベルを使用しているので、一時停止されたトランザクションはロックを保持していないため、1つのトランザクションが一時停止されている間、他のトランザクションは正常に続行できるはずです。もちろん、一時停止されたトランザクションが完了すると、競合が検出される可能性があります。しかし、他の開発者や自動テストが妨げられることなく続行できる限り、それは許容されます。
ただし、実際には、デバッグ中に1人のユーザーがトランザクションを停止すると、スナップショット分離レベルを使用しているにもかかわらず、同じ行にアクセスしようとする他のすべてのDBユーザーがブロックされます。
なぜこれが発生するのか、および/または真の楽観的(非ブロッキング)並行性を実現する方法を誰かが知っていますか?
決議(私にとっては残念なことです):Remus Rusanuは、作家は常に他の作家をブロックしていると述べました。これはMSDNによってバックアップされています-それは完全には出てこないのですが、リーダーライターロックの回避について言及しているだけです。つまり、私が望む動作はSQLServerに実装されていません。
sql-server - トランザクション分離レベルのスコープ
SQL Server 2005のトランザクション分離レベルのスコープルールは何ですか?さまざまなレベルの意味はわかっていますが、手動で実行するスクリプトの外部でそれらを適切に適用する方法はわかりません。本番品質のコードで実用的なガイドが見つかりません。
明らかに、スコープは次のようなコマンドを使用すると始まります。
しかし、それはどこで終わりますか?ストアドプロシージャでisoレベルを設定し、そのprocが別のプロシージャを呼び出す場合、ネストされたprocはそれを継承しますか?さらに良いことに、ネストされたproc内のisoレベルをエスカレートすると、呼び出し元のprocに戻されますか?BEGIN TRAN、ROLLBACK、COMMITなどのトランザクションコマンドは何か違いがありますか?
ストアドプロシージャがアプリケーションまたはエージェントジョブによって呼び出された場合、分離レベルの変更は何らかの方法で持続しますか?各プロシージャの最後に、常にデフォルトのREAD COMMITTEDに戻す必要がありますか?
さまざまな状況でテストしますが、現在の分離レベルが何に設定されているかを読み取る方法がわかりません。
database - トランザクションの ISOLATION レベル
トランザクションの分離レベルに到達するための最良の方法は何ですか? これは、利用可能な ISOLATION レベルの適切なリンクです。
Blockquote 誰かがトランザクションのさまざまな分離レベルを説明できるといいですね
.net - SQL Server テーブルの分離レベルとロックの問題
同じ ADO.Net ステートメントについて、分離レベルとロックに関する私の理解が正しいことを確認したいと思います。
デフォルトの SQL Server 分離レベル (読み取りコミット) では、各行を読み取った後、行のロックが解除されます。
分離レベルを繰り返し読み取りに上げると、ロック (テーブル全体? または他のレベルのロック?) は while ループの終わりまで保持されますか?
例えば:
前もって感謝します、ジョージ
tomcat - TomcatコンテキストからJDBC分離レベルを設定できますか?
Tomcat 6で実行されているWebアプリケーションがあり、組み込みのDBCP接続プールを使用するように構成できました。すべてが正常に機能していますが、データベースで間違った分離レベルで実行されていると思われます。コミットされていない読み取りで実行したいのですが、コミットされた読み取りで実行されていると思います。設定方法がわかりません。
これが私のコンテキストのXMLファイルです。
そして、これはデータベース接続を取得するために使用されるJavaメソッドです。
で接続を取得するとgetDatabaseConnection()
、で分離レベルを手動で設定できることに気付きconn.setIsolationLevel( Connection.TRANSACTION_READ_UNCOMMITTED )
ましたが、Javaに分離レベルをハードコーディングするか、新しい接続が必要になるたびにサーブレットコンテキストのルックアップを実行する必要があるため、これは間違っていると感じます。
どういうわけかコンテキストXMLでこれを定義できますか、それとも私が知らないより良いアプローチがありますか?
sql-server-2005 - デフォルトの SQL Server IsolationLevel の変更
当社のデータベース アプリケーションでブロッキングの問題が発生している顧客がいます。Blocked Process Report トレースを実行するよう依頼したところ、SELECT 操作と UPDATE 操作の間でブロックが発生していることが示されました。トレース ファイルには、次の内容が表示されます。
- 同じ SELECT クエリが異なる分離レベルで実行されています。1 つのトレースは Serializable IsolationLevel を示し、後のトレースは RepeatableRead IsolationLevel を示します。クエリの実行中に明示的なトランザクションは使用しません。
- UPDATE クエリは RepeatableRead 分離レベルで実行されていますが、SELECT クエリによってブロックされています。これは、IsolationLevel が RepeatableRead の明示的なトランザクションで更新がラップされているためです。
基本的に、SELECT クエリの Isolation Level がデフォルトの ReadCommitted IsolationLevel にならない理由について途方に暮れていますが、さらに紛らわしいことに、クエリの IsolationLevel が時間の経過とともに変化するのはなぜでしょうか? この現象が見られるのは 1 人のお客様だけであるため、データベースの構成に問題がある可能性があると考えられます。
何か案は?
前もって感謝します、
グラハム
oracle - トリガーは現在のトランザクション分離レベルで実行されていますか?
ID (一意、Oracle シーケンスから取得)、CATEGORY、および CODE (これらの最後の 2 つは制約なし) の 3 つの列を持つテーブルを考えてみましょう。
各カテゴリには複数のコードが関連付けられていますが、コードはそのカテゴリ内で一意である必要があります。例:
カテゴリ 1 のコード Y が既にあるため、3 番目は OK ではありません。
ここで、挿入の前に実行され、挿入される値に問題がないかどうかを確認するトリガーを考えてみましょう。つまり、挿入されるレコードの場合、トリガーはカテゴリを読み取り、そのカテゴリを持つテーブルからすべてのコードを読み取ります。挿入する必要があるレコードのコードが既に存在する場合は、レコードが挿入されません。
READ_COMMITED
私の質問は、トランザクション分離レベルがで、2 つの異なるトランザクションでほぼ同時に実行される 2 つの挿入があるが、トランザクションが後でコミットされる場合、トリガーはテーブルで何を「見る」のでしょうか?
例:
(1) 最初に、表は次のようになります。
(2) 2 つのトランザクション T1 と T2 があります (READ_COMMITED
両方の分離レベル)。
(3) 両方のトランザクションが、カテゴリ = 1 およびコード = Y を挿入しようとしています。
(4) T1 が挿入を実行し、トリガーが実行されます。表に Y がないので、挿入しても問題ありません。
(5) T2 が挿入を実行し、トリガーが実行されます。テーブルに Y がない (T1 はまだコミットされていない) ため、挿入しても問題ありません。
(6) T1 がコミットし、テーブルは次のようになります。
(7) T2 がコミットします。そこで何が起こるの?エラーが発生してレコードが挿入されないのですか、それとも次の表が表示されますか?
?!
トリガーは何を「認識」し、挿入はどうなりますか?
sql-server - READ_COMMITTED_SNAPSHOT がデフォルトでオンになっていないのはなぜですか?
簡単な質問ですか?
READ_COMMITTED_SNAPSHOT
がデフォルトでオンになっていないのはなぜですか?
下位互換性、パフォーマンス、またはその両方のいずれかだと思いますか?
[編集]スナップショット分離レベルではなく、READ_COMMITTED 分離レベルに関連する効果に関心があることに注意してください。
保持するロックが少なく、まだコミットされていない行を読み取らないため、これが重大な変更になるのはなぜでしょうか?