タグ付けされた質問 「isolation-level」

「分離レベル」についての質問-マルチユーザーデータベースシステムでの同時実行性と一貫性の適用可能な保証を指定する設定。

4
ALLOW_SNAPSHOT_ISOLATIONおよびREAD_COMMITTED_SNAPSHOT
オンラインフォーラムと例のほとんどは、常に両方持つことをお勧めALLOW_SNAPSHOT_ISOLATIONしてREAD_COMMITTED_SNAPSHOT、誰かがスナップショット、行バージョン管理または類似の質問をされるたびにONに設定します。 どちらの設定でもSNAPSHOTという言葉は少し混乱するものと思います。データベースエンジンがREAD_COMMITTEDのデフォルトの動作にロックの代わりに行バージョン管理を使用するために、データベースREAD_COMMITTED_SNAPSHOTはどの設定に関係なく ONに設定されると考えましたALLOW_SNAPSHOT_ISOLATION。 ALLOW_SNAPSHOT_ISOLATION設定は、トランザクション(例えばSETトランザクション分離レベルのスナップショット)を起動するときだけスナップショット分離を可能にするために、ONに設定されているにかかわらずのREAD_COMMITTED_SNAPSHOT設定。 これらの2つの設定をONに設定する唯一の理由は、READ COMMITTED行のバージョン管理と スナップショット分離が必要な場合です。 私の質問は、私の理解が何らかの形で間違っているのですか?そして、これら2つの設定は常に一緒にONに設定する必要があります(特にREAD COMMITTED行バージョン管理の場合)?

3
SELECT-UPDATEパターンを使用する場合の同時実行性の管理
次のコードがあるとしましょう(ひどいことは無視してください): BEGIN TRAN; DECLARE @id int SELECT @id = id + 1 FROM TableA; UPDATE TableA SET id = @id; --TableA must have only one row, apparently! COMMIT TRAN; -- @id is returned to the client or used somewhere else 私の目には、これは並行性を適切に管理していません。トランザクションがあるからといって、更新ステートメントに到達する前に他の誰かがあなたと同じ値を読み取らないということにはなりません。 今、コードをそのままにしておきます(これは単一のステートメントとして処理するか、自動インクリメント/ ID列を使用することをお勧めします)並行性を適切に処理し、2つのクライアントが同じになる競合状態を防ぐ確実な方法id値? WITH (UPDLOCK, HOLDLOCK)SELECTにa を追加するとうまくいくと確信しています。SERIALIZABLEトランザクション分離レベルは、(それは誰にもTRANが終わるまで、あなたが何をしたか読むことを拒否したことから、同様の作業に思えるでしょうUPDATE:これは偽であることがわかりマーティンの答え)。本当?どちらも同等に機能しますか?一方が他方よりも優先されますか? IDの更新よりも正当なもの、つまり更新が必要な読み取りに基づいた計算を行うことを想像してください。多数のテーブルが関係している可能性がありますが、そのうちのいくつかは書き込みを行い、他のテーブルは書き込みを行いません。ここでのベストプラクティスは何ですか? この質問を書いた後、必要なテーブルのみをロックしているので、ロックヒントの方が優れていると思いますが、誰かの入力に感謝します。 PSそして、いいえ、私は最良の答えを知りません、そして、本当に、より良い理解を得たいです!:)

3
SET TRANSACTION ISOLATION LEVELの利点はコミットされていません
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED私が一般的なSQLクエリの大部分で使用しているのは、主に言語を最初に学習したときにこれがドリルダウンされたためです。 私の理解では、この分離レベルは、WITH (NO LOCK)私が使用する傾向があるのと同じように機能しますSET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED。 私が使用してしなければならないという時間今までありWITH (NO LOCK)オーバーがSET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED。 DOESは SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED私が読んでいていることの表からロックアウトされることから、他のユーザーを停止しますか? 場合は SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED、ストップロックに使用されているが、私はデータのみを読んでいます、それを使用してのポイントは何ですか?ロックを生成するのはシステム集中型のクエリだけですか?たとえば5〜10秒で返されるクエリを実行するときに使用する価値はありますか。 SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTEDおそらくダーティデータの更新を避けるために、更新で使用されるデータを読み取るときは使用しないように言わ れました。これが唯一の理由でしょうか? 私が取り組んでいるデータベースのタイプには、実稼働環境とテスト環境があります。実稼働環境にクエリを実行することはほとんどありませんが、必要に応じて、通常SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTEDはクエリで使用します。これでダーティリードが可能であることを理解しています。最終的にデータベースにコミットされない可能性のあるデータを受信する(そして結果を破棄する)以外に、他の種類の「ダーティリード」は可能ですか? 大量の質問で申し訳ありません。

2
InnoDBはコミットする前にトランザクションデータをどこに格納しますか?
私は、JDBCテクノロジーを使用して、自宅でいくつかのテストをREAD_COMMITTED行いREAD_UNCOMMITTEDました。 READ_UNCOMMITTED実際にコミットされていないデータ、たとえばまだコミットされていないトランザクションからのデータを読み取ることができることがわかります(UPDATEクエリを実行できます)。 ご質問 READ_UNCOMMITTEDトランザクションがコミットされていないデータを別のトランザクションから読み取ることができるように、コミットされていないデータはどこに保存されますか? READ_COMMITTEDトランザクションがコミットされていないデータを読み取ることができない、つまり「ダーティリード」を実行できないのはなぜですか。この制限を強制するメカニズムは何ですか?

4
MySQL InnoDBは、READ COMMITTEDであっても削除時に主キーをロックします
序文 私たちのアプリケーションは、DELETEクエリを並行して実行するいくつかのスレッドを実行します。クエリは分離されたデータに影響します。つまりDELETE、別々のスレッドからの同じ行で同時発生する可能性はありません。ただし、ドキュメントごとに、MySQLはDELETEステートメントにいわゆる「次のキー」ロックを使用します。これにより、一致するキーと一部のギャップの両方がロックされます。このことはデッドロックを引き起こし、私たちが見つけた唯一の解決策はREAD COMMITTED分離レベルを使用することです。 問題 巨大なテーブルDELETEがJOIN複数ある複雑なステートメントを実行すると問題が発生します。特定のケースでは、警告が2行しかないテーブルがありますが、クエリは2つの個別のINNER JOINedテーブルから特定のエンティティに属するすべての警告を削除する必要があります。クエリは次のとおりです。 DELETE pw FROM proc_warnings pw INNER JOIN day_position dp ON dp.transaction_id = pw.transaction_id INNER JOIN ivehicle_days vd ON vd.id = dp.ivehicle_day_id WHERE vd.ivehicle_id=? AND dp.dirty_data=1 day_positionテーブルが十分に大きい場合(私のテストケースでは1448行あります)、READ COMMITTED分離モードでもトランザクションはテーブル全体を ブロックしproc_warningsます。 この問題は常にこのサンプルデータ(http://yadi.sk/d/QDuwBtpW1BxB9)で再現されます(MySQL 5.1(5.1.59でチェック)およびMySQL 5.5(MySQL 5.5.24でチェック))。 編集:リンクされたサンプルデータには、クエリテーブルのスキーマとインデックスも含まれています。 CREATE TABLE `proc_warnings` ( `id` int(11) NOT NULL AUTO_INCREMENT, `transaction_id` int(10) …

6
READ UNCOMMITTED分離レベルを使用するのに最適な状況
ご存じのとおり、READ UNCOMMITTEDは、ダーティリードやファントムリードなどが発生する可能性がある最低の分離レベルです。この分離レベルを使用するのに最適な時期はいつですか、どのような理由で使用されるのですか? 実は前に答えを読んでみましたが、例が少ないので完全には理解できませんでした。

2
IsolationLevel.ReadUncommittedで発行された共有ロック
IsolationLevel.ReadUncommittedを使用すると、クエリでロックが発行されないはずです。しかし、これをテストすると、次のロックが表示されました。 Resource_Type:HOBT Request_Mode:S(共有) HOBTロックとは何ですか?HBT(ヒープまたはバイナリツリーロック)に関連する何か? なぜまだSロックを取得するのですか? 分離レベルのスナップショットオプションをオンにせずにクエリを実行するときに、共有ロックを回避するにはどうすればよいですか? SQLServer 2008でこれをテストしていますが、スナップショットオプションはオフに設定されています。クエリは選択のみを実行します。 SQL Serverがロッククエリでそれを表示していないようですが、Sch-Sが必要であることがわかります。それでも共有ロックが発行されるのはなぜですか?による: トランザクション分離レベルの設定(Transact-SQL) READ UNCOMMITTEDレベルで実行中のトランザクションは、他のトランザクションが現在のトランザクションによって読み取られたデータを変更するのを防ぐために、共有ロックを発行しません。 だから私は少し混乱しています。

4
SET TRANSACTION ISOLATION LEVEL SERIALIZABLEの後にコミットされた読み取りを追加しますか?
ストアドプロシージャの内部には、次のものがあります。(SQL Server 2008) SET TRANSACTION ISOLATION LEVEL SERIALIZABLE BEGIN TRANSACTION getStuff BEGIN TRY /* some selects, updates, etc, etc. */ .... COMMIT TRANSACTION getStuff END TRY BEGIN CATCH ... END CATCH これはトランザクションベースであるため、残りのデータベース接続はSERIALIZABLEの影響を受けないだろうと私は考えました。 コミット後にコミットされた読み取りに暗黙的に分離レベルを設定する必要がありますか?これは、アプリケーションサーバーとデータベースサーバー間の他の接続に悪影響を及ぼしますか?

3
SQL Server-非ブロッキングselectステートメントの分離レベルは何ですか?
SQL Server 2008 R2のテーブルで一部の削除、更新、および挿入を実行する長時間実行トランザクション(たとえば、T1と呼ばれます)があります。同時に、別のプロセスが定期的にこのテーブルの選択ステートメントを実行します。 デフォルトの分離設定(READ COMMITTEDだと思いますか?)では、T1は、トランザクションがコミットまたはロールバックされるまで、selectステートメントの実行をブロックします。 私が見たいのは、トランザクションが進行中でも、selectステートメントが一貫したデータで機能することです。スナップショット分離が役立つと思いますが、正しい方向に進んでいるかどうかはわかりません。これは、このアプリケーションに最適な分離レベルでしょうか? 次に、selectステートメントを呼び出しているプロセスを制御することはできませんが、T1を呼び出す.NETアプリケーションを制御します。selectステートメントとT1の両方で分離レベルの変更が必要ですか、それともT1だけを別の分離レベルとしてマークするだけで十分でしょうか?

2
SQL Serverのシリアル化可能な分離レベルはテーブル全体をロックしますか
私と私の同僚は、シリアル化可能な分離レベルの使用の影響について説明しました。彼はそれがテーブル全体をロックしたと言いましたが、私は彼にそれが潜在的に可能であると伝えることに同意しませんでしたが、それは範囲ロックを適用しようとし、ここで説明されるように真のシリアライゼーションを適用しません:シリアライズ可能な分離レベル。 「テーブル全体をロックする」のドキュメントでも何も見つかりません:SET TRANSACTION ISOLATION LEVEL。 ドキュメントには範囲ロックに関する多くの事項が記載されているため、理論的には、テーブル内の可能な値の範囲全体をロックする範囲ロックを持つだけでテーブル全体をロックできますが、テーブルはロックされません。 ここで私は完全に間違っていますか?それは実際にテーブル全体をロックしていますか?

1
SQL Server 2017およびAzure SQL DBでの既定の分離レベルの検索
トランザクションと並行性に関する本を読んでいます。1つの段落では、次のように述べられています。 オンプレミスのSQL Serverインスタンスでは、デフォルトの分離レベルはロックに基づいて読み取りコミットされています そして次の文は: SQLデータベースのデフォルトは読み取りです-行のバージョン管理に基づいてコミットされたスナップショット 私の質問は、これらの2つの文で「オンプレミスSQL Serverインスタンス」と「SQLデータベース」の違いは何ですか? デフォルトの分離レベルとは何ですか?どのようにして見つけることができますか?デフォルトの分離レベルを確認するための特別なクエリはありますか?

1
重複なしでテーブルから返された重複レコード
私のシステムで作業を分散するために使用されるビジーキューテーブルをクエリするストアドプロシージャがあります。問題のテーブルにはWorkIDの主キーがあり、重複はありません。 クエリの簡略版は次のとおりです。 INSERT INTO #TempWorkIDs (WorkID) SELECT W.WorkID FROM dbo.WorkTable W WHERE (@bool_param = 0 AND ((W.InProgress = 0 AND ISNULL(W.UserID, -1) != @userid_param AND (@bool_filtered = 0 OR W.TypeID IN (SELECT TypeID FROM #Types AS t))) OR (@bool_param = 1 AND W.InProgress = 1 AND W.UserID != @userid_param) OR …

3
「接続が閉じてプールに戻されると、最後のSET TRANSACTION ISOLATION LEVELステートメントからの分離レベルが保持されます」?
MSDNオンライン記事「SQL Serverのスナップショット分離」には、次のように記載されています。 「分離レベルには接続全体のスコープがあり、SET TRANSACTION ISOLATION LEVELステートメントを使用して接続に設定されると、接続が閉じられるか、別の分離レベルが設定されるまで有効です。接続が閉じられ、プールに戻されるとき、最後のSET TRANSACTION ISOLATION LEVELステートメントからの分離レベルが保持されます。プールされた接続を再利用する後続の接続では、接続がプールされたときに有効だった分離レベルが使用されます。 自己矛盾する段落ではありませんか(「まで」と「保持」)。 次に、接続を閉じてプールに戻した後、「最後のSET TRANSACTION ISOLATION LEVELステートメントからの分離レベルが保持されている」場合、それをどのように理解する必要がありますか。 デフォルトの分離レベルは任意の値になります(プール内の異なる接続には異なる分離レベルがあり、その値は再オープンされる接続に依存します)? または、プール内のすべての接続のすべてのデフォルト値が最後の値に変更されますか?しかし、手に入る前にまた全く未知ですか?

2
SQL Server選択カウントREAD_COMMITTED_SNAPSHOT QUESTION
特定のテーブルでselect count(*)を実行すると、多くのデッドロックが発生しているようです。私はすでにすべての必要なパラメーターを変更し、それらを行のみのロックにしています。 また、READ_COMMITTED_SNAPSHOT分離を使用するようにデータベースを変更しました。 ただし、select count(*)where column =?テーブル上でデッドロックまたはテーブル上のロックをトリガーします。 select count(*)は中間行にのみアクセスする必要があることは正しいのでしょうか?しかし、それはそのようには見えず、依然としてデッドロックが発生しています。適切な索引付けはおそらく役立つでしょう。 問題は、SQL Server 2008 R2は、read_committed_snapshotがonに設定されている場合でも、select count(*)中にテーブルに共有ロックを設定しますか? ありがとう

2
スナップショットアイソレーションを使用すると、SQL Serverデータベースの書き込みが遅くなりますか?
システムで多くのデッドロックが発生しています。 それらを修正するためにスナップショットアイソレーションを使用したいのですが、私のDBAはそれについて予約しています。 彼の懸念の1つは、スナップショット分離が書き込み速度を低下させることです。これは、キャッシュに書き込んでからTempDb(行バージョン)に書き込む必要があり、呼び出し元に戻ることができるためです。 「通常の」書き込みは、キャッシュに書き込むだけで実行できます。 これは行のバージョン管理のしくみですか?それともそれよりも複雑ですか?それはどういうわけかこれらを並行して行いますか? それともスナップショットアイソレーションでは書き込みが遅くなりますか?
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.