問題タブ [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-server - 分離レベルの向上が SQL Server のパフォーマンスの向上につながる理由
クエリのパフォーマンスを測定すると、分離レベルと経過時間の間に驚くべき依存関係があることがわかりました。
左の列はテーブル ヒントで、右の列はマイクロ秒単位の経過時間 (sys.dm_exec_query_stats.total_elapsed_time) です。分離レベルを高くするとパフォーマンスが向上するのはなぜですか? これは開発マシンであり、並行性はまったく発生しません。ロックのオーバーヘッドが少ないため、READUNCOMMITTEDが高速になると思います。
更新:これを測定しました
プロファイラーは、キャッシュ ヒットが発生していないことを確認します。
sql-server - READ UNCOMMITTED分離レベルを使用するのはなぜですか?
平易な英語で、使用することの短所と長所は何ですか
.NETアプリケーションとレポートサービスアプリケーションのクエリで?
sql - トランザクションの同時実行に対する保護 (トランザクション タイプ; トランザクション IsolationLevel)
中間層コンポーネントは、アプリケーションでデータ アクセス ルーチンを実行します。コンポーネントは、いくつかの SQL Server ストアド プロシージャを呼び出して、データベースの更新を実行します。これらのプロシージャ コールはすべて、1 つのトランザクションの制御下で実行されます。中間層のコードは、次のオブジェクトを実装します。
このようなエラーに対して可能な限り高いレベルの保護を指定するためにコンポーネントにコードを追加する方法 (2 人のユーザーが同じデータを同時に更新しようとする)。
sql-server - スナップショット分離モードでは READPAST を使用できません
次のことを行う複数のスレッドから呼び出されるプロセスがあります。
- 取引開始
IsProcessed=0
ヒントのある次の行を見つけて、作業テーブルから作業単位を選択します(UPDLOCK, HOLDLOCK, READPAST)
- 作業単位を処理する (C# および SQL ストアド プロシージャ)
- トランザクションをコミットする
これの考え方は、スレッドが「次の」作業のためにプールに浸り、それを処理し、1 つの作業が 2 回処理されないようにするためにロックが存在するというものです。(順番は関係ありません)。
これらすべてが何ヶ月もうまく機能しています。今日まで、つまり、スナップショット分離を有効にしてデータベース レベルでデフォルトに設定しているにもかかわらず、実際のトランザクション作成コードは手動で "ReadCommitted" の分離レベルを設定していたことに気付きました。
私はそれを「スナップショット」に正式に変更し、もちろんすぐに以下のメッセージを受け取りました:
READ COMMITTED または REPEATABLE READ では、READPAST ロックのみを指定できます。
行をロックする主な理由は、マークを適用したトランザクションがコミットされたときに「マーク」が削除されるように「行にマークを付ける」ことであり、ロックはこれを行うための最良の方法であると思われました。テーブルは、これらのスレッド以外では読み取られません。IsProcessed フラグをロックとして使用する場合、おそらく最初に更新を行ってから、更新したばかりの行を選択する必要がありますが、NOLOCK フラグを使用して、他のスレッドが設定したかどうかを知る必要があります。旗が並んでいます。
すべてが少し乱雑に聞こえます。最も簡単なオプションは、スナップショット分離モードを完全に放棄することですが、ステップ #3 の設計ではそれが必要です。
この問題を解決する最善の方法について何か素晴らしいアイデアはありますか?
oracle - Oracle トランザクションの読み取り一貫性?
データベース (Oracle) の読み取り一貫性を理解するのに問題があります。
私が銀行のマネージャーであるとします。顧客がロックを取得し (これはわかりません)、更新を行っています。彼がロックを取得した後、私は彼らのアカウント情報を表示し、それに対して何かをしようとしています. しかし、読み取りの一貫性のために、顧客がロックを取得する前に存在していたデータが表示されます。それで、それは私が得ているインプットと、その期間中に私が下そうとする決定に影響しませんか?
sql-server - コミットされたスナップショット VS スナップショット分離レベルの読み取り
SQL Server で READ COMMITTED SNAPSHOT よりも SNAPSHOT 分離レベルを使用するタイミングを理解するのを手伝ってくれませんか?
ほとんどの場合、READ COMMITTED SNAPSHOT が機能することは理解していますが、いつ SNAPSHOT 分離を行うかはわかりません。
ありがとう
birt - BIRT でのトランザクション分離の定義
私の BIRT レポートは、SQL クエリ (JDBC データソース) を使用してデータを取得します。私の SQL Server 2005 データベースは、スナップショット トランザクション分離を使用するように設定されています。
BIRT レポート デザイナーでトランザクション分離モードを定義するにはどうすればよいですか?
プログラム的には、データソース メソッド setDefaultTransactionIsolation(4096) を呼び出すことで完了します (4096 はスナップショット分離を意味します)。
sql-server - Sql Serverで読み取り/書き込み比率を計算する方法は?
Sql Server 2005 で読み取り/書き込み比率を照会するにはどうすればよいですか? 知っておくべき注意事項はありますか?
おそらく、DMV クエリ、標準レポート、カスタム レポート (パフォーマンス ダッシュボードなど)、または Sql Profiler トレースの調査で見つけることができます。正確にはわかりません。
なぜ私は気にするのですか?
Web アプリのデータ層のパフォーマンスを改善するために時間を費やしています。何百万ものレコードと何千ものユーザーを扱っています。
私が検討しているポイントの 1 つは、データベースの同時実行性です。Sql Server は、既定でペシミスティック コンカレンシーを使用します。これは、書き込みの多いアプリに適しています。私のアプリが読み取り負荷が高い場合は、Jeff Atwood が StackOverflow で行ったread committed snapshot
ように、オプティミスティック コンカレンシー (分離レベル: )に切り替える可能性があります。
.net - 次の「存在しない場合の挿入」トランザクションには、どの分離レベルを使用する必要がありますか?
基本的にETLタスクを実行するlinq-to-sqlプログラムを作成しましたが、並列化によってパフォーマンスが向上する場所がたくさんあることに気づきました。ただし、2つのスレッドが次のタスク(疑似コード)を実行するときに、一意性制約違反を防ぐことが心配です。
一般に、このコードは、SELECT
レコードの存在をテストするステートメントを実行し、その後にINSERT
レコードが存在しない場合はステートメントを実行します。暗黙のトランザクションによってカプセル化されます。
2つのスレッドがの同じインスタンスに対してこのコードを実行する場合recordText
、レコードが存在しないことを同時に判断して、両方が同じレコードを作成しようとするのを防ぎたいと思います。分離レベルと明示的なトランザクションはうまく機能しますが、どの分離レベルを使用Serializable
すべきかわからない場合は、機能するはずですが、厳密すぎるようです。より良い選択肢はありますか?
c# - LINQでMAXを取得するためのテーブルのロック
LINQにクエリがあります。テーブルのコードの最大値を取得して増やし、新しいコードで新しいレコードを挿入したいと思います。SQL ServerのIDENTITY機能と同じですが、ここでのコード列はchar(5)で、アルファベットと数値を使用できます。
私の問題は、新しい行を挿入するときに、2つの並行プロセスがmaxを取得し、同じコードをレコードに挿入することです。
私のコマンドは:
このコマンドを1000スレッドで実行し、それぞれが200の顧客を更新し、IsolationLevel.Serializableでトランザクションを使用しました。2、3回実行した後、エラーが発生しました。
エラー:
トランザクション(プロセスID 60)は、別のプロセスとのロックリソースでデッドロックされ、デッドロックの犠牲者として選択されました。トランザクションを再実行します。
他のIsolationLevelsはこのエラーを生成します:
行が見つからないか、変更されていません。
助けてください、ありがとう。
UPDATE2:英数字の新しいコードを生成する.NETメソッドがあります。UPDATE3:私の.NET関数は次のようなコードを生成します:0000、0001、0002、...、0009、000a、000b、000c、...、000z、0010、0011、0012、...、0019、001a、001b 、001z、.....。