DBMSのロック・分離戦略と同時実行制御
をテンプレートにして作成
[
トップ
] [
新規
|
一覧
|
単語検索
|
最終更新
|
ヘルプ
]
開始行:
「[[マイクロソフト系技術情報 Wiki>http://techinfoofmicros...
-[[戻る>データアクセスのいろいろ]]
* 目次 [#n7479520]
#contents
*はじめに [#g7fe854c]
本ドキュメントでは、データベース アプリケーションを~
開発する際に知っておく必要がある、DBMS毎の
-ロック・分離戦略
-同時実行制御
を説明する。
例えば、OracleとSQL Serverのデータの
-ロック・分離戦略と、
-同時実行制御には
以下のような違いがある。
-Oracleでは、参照すべきデータのバージョンを判断し、ロック...
-SQL Server(の既定の設定)では、ロック制御によって、デー...
このような実装の違いを把握しないまま、Oracleと同じ感覚でS...
意図しないロック待ちが発生することになり、パフォーマンス...
*トランザクションとデータの一貫性 [#pc81bc15]
1つ以上のSQL文を含む作業単位で、トランザクションが有効で...
ACIDと呼ばれる4つのトランザクションの基本特性を備えている...
|原子性|Atomicity|
|一貫性|Consistency|
|分離(独立)性|Isolation|
|持続(永続)性|Durability|
これを実現するための、ロック・分離戦略と、同時実行制御の...
以下のようにOracleとSQL Serverで大きな相違がある。
-Oracleでは、一時領域を使用した「多バージョン法」(MultiV...
-SQL Server(の既定の設定)では「ロック法」を使用する。
次節では、
-「多バージョン法」
-「ロック法」
の概要について説明する。
※ なお、本ドキュメントでは「多バージョン法」と「ロック法...
**多バージョン法 [#z1614545]
多バージョン法(MultiVersion Concurrency Control:MVCC)と...
新旧の、複数のバージョンのデータを保持してデータの読み取...
このため、Oracleは、『マルチバージョン データベース』、『...
+Oracleでは、あるアプリケーションが更新トランザクションを...
データの旧バージョンは一時領域に保持される。
+他のアプリケーションがそのデータに対する読み取り要求をす...
一時領域に保持された旧バージョンのデータを取り出す。
+更新トランザクションがコミットされると、一時領域の旧バー...
アプリケーションはテーブル上の新バージョンのデータを見る...
**ロック法 [#cf148e22]
SQL Server(の既定の設定)では、データの読み取り一貫性の...
+あるアプリケーションが更新トランザクションを開始すると、~
テーブル内の更新レコードには排他ロック(X)が保持される。
+他のアプリケーションがそのレコードに対する読み取り要求を...
以外の読み取りトランザクションでは、レコードを取り出すこ...
+更新トランザクションがコミットされると、排他ロック(X)...
アプリケーションは更新されたレコードを見ることになる。
**多バージョン法とロック法 [#y54096e5]
-「多バージョン法」を採用しているデータベースには、Oracle...
-「ロック法」を採用しているデータベースにはSQL Server、DB...
一般的な同時実行制御方式は「ロック法」と言われていたが、
近年は、「多バージョン法」の同時実行制御に対応したDBMSも...
#ref(1_LockAndMVCC.png,left,nowrap,多バージョン法とロック...
**アプリケーション開発にて問題となる点 [#vd5cf469]
多バージョン法と、ロック法の最も大きな違いは、更新中のデ...
Oracleでは、多バージョン法により、一時領域に保持された、...
>つまり、Oracleでは、読み取るデータが更新中であっても検索...
これに対し、SQL Serveでは、ロック法による同時実行制御のた...
読み取るデータが更新中の場合は、すでにそのデータに排他ロ...
共有ロックをかけることができない。
>つまり、SQL Serverでは、更新中のデータに読み手はアクセス...
このような、実装の特徴を理解していないと、アプリケーショ...
パフォーマンス劣化やデッドロックなどのトラブルに見舞われ...
*トランザクション分離レベル [#z75a5422]
**サポートされる分離レベル [#z48ca945]
-トランザクションの分離レベルとは、トランザクションを、他...
--分離レベルが高くなるとデータの一貫性は確保されるが、ア...
--分離レベルが低くなるとアプリケーションの同時実効性は向...
-Oracleは、
--コミット読み取り(Read Committed)
--直列可能(Serializable)
>の2つをサポートしている。
-それに対し、SQL Serverは、~
ANSI/ISO標準のトランザクション分離レベルをすべてサポート...
--未コミット読み取り(Uncommitted Read)
--コミット読み取り(Read Committed)
--繰り返し可能読み取り(Repeatable Read)|未サポート
--直列可能(Serializable)
-OracleもSQL Serverもデフォルトの~
トランザクション分離レベルはコミット読み取り(Read Committ...
以下に、OracleとSQL Serverがサポートする~
ANSI/ISO標準のトランザクション分離レベルの対応表を示す。
|ANSI・ISO標準のトランザクション分離レベル|Oracle|SQL Ser...
|未コミット読み取り(Uncommitted Read)|未サポート|○|
|コミット読み取り(Read Committed)|○(default)|○(default)|
|繰り返し可能読み取り(Repeatable Read)|未サポート|○|
|直列可能(Serializable)|○|○|
**分離レベルと、同時実行における3つの問題 [#c18a508a]
ANSI/ISO SQL規格は、 同時に実行されるトランザクションの分...
次に、この3つの問題点について説明する(同時実行における...
***ダーティ・リード [#t8aa7375]
同時に実行されている、~
まだコミットされていないトランザクションが~
書き込んだデータを読み込んでしまう。
#ref(2_DirtyRead.png,left,nowrap,DirtyRead)
.png [詳細] .png [詳細] file
***反復不可能読み取り [#tc130c6f]
トランザクションが過去に読み込んだデータをもう一度読み込...
他のトランザクションによって書き換えられ、コミットされた...
#ref(3_RepeatableRead.png,left,nowrap,RepeatableRead)
***ファントム・リード [#s3fdbf36]
トランザクションが、ある行の集合を返す検索条件で問い合わ...
別のトランザクションがその問い合わせ条件を満たす行を追加...
#ref(4_PhantomRead.png,left,nowrap,PhantomRead)
***3つの問題点の対応表 [#zc99c0a3]
|ANSI・ISO標準のトランザクション分離レベル|ダーティ・リー...
|未コミット読み取り(Uncommitted Read)|有|有|有|
|コミット読み取り(Read Committed)|-|有|有|
|繰り返し可能読み取り(Repeatable Read)|-|-|有|
|直列可能(Serializable)|-|-|-|
***分離レベルの実現方式 [#ma87eb92]
本節では、OracleとSQL Serverの分離レベルの実現方式ついて...
-Oracleでは、参照するデータのバージョンを選択することによ...
コミット済み読み取り(Read Committed)・直列化(Serializable...
-SQL Serverでは、分離レベルの設定により、~
データ参照時に適用されるロックの期間、ロックの種類が変更...
|ANSI/ISO標準トランザクション分離レベル|Oracle|SQL Server|h
|未コミット読み取り(Uncommitted Read)|更新中のデータは、...
|コミット読み取り(Read Committed)|~|データの読み取りに、...
|繰り返し可能読み取り(Repeatable Read)|~|トランザクショ...
|直列可能(Serializable)|自トランザクションの開始以降に開...
**更新データの消失 [#b0a95486]
次に、『更新データの消失』の対処法と、分離レベルとの関係...
2つのトランザクションが行を読み取り、それぞれ、行を更新...
-最初に更新したトランザクションの変更は、後から更新したト...
-最初に更新したトランザクションの更新は、気が付かないうち...
#ref(5_LossOfDataUpdate.png,left,nowrap,LossOfDataUpdate)
『更新データの消失』は、以下の方法で回避できる。
-ロックを使用しないOracleデータベースでは、
--更新対象のデータには、明示的に更新ロックをホールドで掛...
--トランザクションの分離レベルに、直列化(Serializable)を...
『レコードに対する変更が、自トランザクションの開始時にす...
>という制御を使用する。
-SQL Serverでは、
--繰り返し可能読み取り(Repeatable Read)以上の分離レベルで...
対象データに共有ロックをホールドで掛ける。
--コミット済み読み取り(Read Committed)の分離レベルで、~
明示的に更新ロックをホールドで掛ける。
*ロック・メカニズムの詳細 [#pecf549e]
本章では、ロックの互換性と、更新ロックについて詳しく説明...
**ロックの互換性 [#vca71466]
基本的なロックの互換性については以下の表に示す通りである。
Oracleに関しては、参照時にロックを掛けることが無いため、
-「共有ロックが存在しない」
--⇒ 「共有ロックと排他ロックの違いが無い」
---⇒ 「排他ロックのみ存在する」
と言うことになる。
|/|>|>|既にかけられているモード|h
|要求されたモード|共有(S)|更新(U)|排他(X)|
|共有(S)|○|○|×|
|更新(U)|○|×|×|
|排他(X)|×|×|×|
※ SQL Serverには、[[インテントロック>#e4866bc5]]等、特殊...
ユーザが制御するものでは無いため、ここでは割愛する。
**更新ロックの役割 [#h6c1ac80]
OracleとSQL Serverの更新ロックは、双方『更新データの消失...
SQL Serverの場合、『更新データの消失』の防止は、共有ロッ...
このため、SQL Serverの更新ロックは『デッドロック』防止の...
*トランザクションの実装方式 [#fcfbae68]
前述の、「多バージョン法」・「ロック法」の、~
トランザクション設計 ~ 実装方式の決定フローチャートを以...
※「多バージョン法」の方がディシジョン(判断)が浅く、設計...
**多バージョン法 [#xf9852ee]
WEBのような、DBMSトランザクションを使用できない方式で、U...
┃
┣ YES ⇒ タイムスタンプを使用せざるを得ない(楽観方式)。
┃
┗ NO ⇒ DBMSトランザクションを使用することができる。
┃
┗ ⇒ 排他方式に、楽観方式を採用する?
┃
┣ YES ⇒ 分離レベルを直列化(Serializab...
┃
┗ NO ⇒ 更新前提の読み取りに、明示的に...
※ 更新ロックの競合時、待機するか、待機しないかを設定する...
**ロック法 [#t7f79038]
WEBのような、DBMSトランザクションを使用できない方式で、...
┃
┣ YES ⇒ タイムスタンプを使用せざるを得ない。
┗ NO ⇒ DBMSトランザクションを使用することができる。
┃
┗ ⇒ DBMSトランザクションを使用できるがDBに負荷を...
┃
┣ YES ⇒ コミット済み読み取り(Read Committ...
┗ NO ⇒ 特に問題が無い場合は、DBMSトランザ...
┃
┗ ⇒ 排他方式に、楽観方式を採用す...
┃
┣ YES ⇒ コミット済み読み取...
┃ タイムスタンプを...
┃
┗ NO ⇒ 悲観方式を、簡単に...
┃
┣ YES ⇒ 繰り返し...
┃ 参照処...
┗ NO ⇒ コミット...
更新前...
SQL Server では、繰り返し可能読み取り(Repeatable Read)以...
*SQL Serverでの多バージョン法のサポート [#we9e7704]
SQL Server2005からは、多バージョン法を使用した、同時実行...
多バージョン法を使用した、同時実行制御(MVCC)を使用する...
**2つの方法 [#kc2d8dc3]
***方法1:READ_COMMITTED_SNAPSHOT [#a0c274ec]
READ_COMMITTED_SNAPSHOT は、Oracleでのデフォルトの動作 と...
ステートメント発行時点での正しいデータを参照できることを...
***方法2:スナップショット分離レベル [#n60ad904]
スナップショット分離レベルは、OracleのSerializableの分離...
トランザクション発行時点での正しいデータを参照できること...
**設定方法 [#n1fca193]
上記の多バージョン法を使用した、同時実行制御(MVCC)はデ...
利用の際は、DBMSへ下記の設定が必要になる。
***設定1:READ_COMMITTED_SNAPSHOT [#g3f85ca5]
以下のようにデータベースに対して READ_COMMITTED_SNAPSHOT ...
ALTER DATABASE データベース名
SET READ_COMMITTED_SNAPSHOT ON
***設定2:スナップショット分離レベル [#ocaa8477]
以下のようにデータベースに対して ALLOW_SNAPSHOT_ISOLATION...
ALTER DATABASE データベース名
SET ALLOW_SNAPSHOT_ISOLATION ON
詳しくは、以下のドキュメントを参照のこと。
-SQL Server 2005 Tips and Tips > 第2回 排他ロックにブロ...
http://www.microsoft.com/japan/sqlserver/2005/ssj/tips/02...
*SQLServerのロック法と多バージョン法の比較 [#q9fc2610]
-ロック法が既定のモードなのでロック法の方が多い気がします...
多バージョン法が使えないという情報も聞きません。
-昔、中の人にロック法と多バージョン法のどっちに自信あるの...
と聞いた事がありますが、回答無しでした(まぁ、あたりまえ...
**トレード・オフを考慮して使い分ける [#ed97e0e7]
調べてみましたが、以下のトレード・オフを考慮して使い分け...
-ロック法と多バージョン方を比較すると、多バージョン方は、
--ブロッキングやデッドロックが発生し難くなるが、
--TEMPDB を使用し、処理のオーバヘッドも大きくなる。
>ということのようです。
-ちなみに、デフォルトは、
--SQL Server では READ_COMMITTED_SNAPSHOT がデフォルトで ...
--SQL Azure では、READ_COMMITTED_SNAPSHOT がデフォルトで ON
>だそうです。
**参考 [#e979aa18]
あまり情報がありませんでしたが、以下の情報が非常に参考に...
-SQL Server の読み取り一貫性とロック|システム開発のブロ...
https://bellsoft.jp/blog/system/detail_586
*その他のトピック [#x4baac76]
**インテントロック [#e4866bc5]
より粒度の低いロックリソースにロックを保持していることを...
内部仕様(内部システム)で使用されるため、外部仕様として...
-ロックマネージャは、単に一つのロックリソースに対してロッ...
コレだけでは、ロックの互換性から、テーブルに共有ロックを...
-インテントロックはコレを防ぐため、更新時、行に排他ロック...
この場合、テーブルに共有ロックがかかっていれば、行に排他...
-参考
--インテントロックとは? – Microsoft SQL Server Japan Sup...
https://blogs.msdn.microsoft.com/jpsql/2012/06/27/609/
*参考 [#mf1b9e3e]
**[[SQL Server でのロック・タイムアウト]] [#f6c7f906]
**[[SQL Server のロックのエスカレーション]] [#k5e5d1dd]
**[[SQL Server でのデッドロック]] [#i715456a]
----
Tags: [[:データアクセス]], [[:SQL Server]], [[:ADO.NET]]
終了行:
「[[マイクロソフト系技術情報 Wiki>http://techinfoofmicros...
-[[戻る>データアクセスのいろいろ]]
* 目次 [#n7479520]
#contents
*はじめに [#g7fe854c]
本ドキュメントでは、データベース アプリケーションを~
開発する際に知っておく必要がある、DBMS毎の
-ロック・分離戦略
-同時実行制御
を説明する。
例えば、OracleとSQL Serverのデータの
-ロック・分離戦略と、
-同時実行制御には
以下のような違いがある。
-Oracleでは、参照すべきデータのバージョンを判断し、ロック...
-SQL Server(の既定の設定)では、ロック制御によって、デー...
このような実装の違いを把握しないまま、Oracleと同じ感覚でS...
意図しないロック待ちが発生することになり、パフォーマンス...
*トランザクションとデータの一貫性 [#pc81bc15]
1つ以上のSQL文を含む作業単位で、トランザクションが有効で...
ACIDと呼ばれる4つのトランザクションの基本特性を備えている...
|原子性|Atomicity|
|一貫性|Consistency|
|分離(独立)性|Isolation|
|持続(永続)性|Durability|
これを実現するための、ロック・分離戦略と、同時実行制御の...
以下のようにOracleとSQL Serverで大きな相違がある。
-Oracleでは、一時領域を使用した「多バージョン法」(MultiV...
-SQL Server(の既定の設定)では「ロック法」を使用する。
次節では、
-「多バージョン法」
-「ロック法」
の概要について説明する。
※ なお、本ドキュメントでは「多バージョン法」と「ロック法...
**多バージョン法 [#z1614545]
多バージョン法(MultiVersion Concurrency Control:MVCC)と...
新旧の、複数のバージョンのデータを保持してデータの読み取...
このため、Oracleは、『マルチバージョン データベース』、『...
+Oracleでは、あるアプリケーションが更新トランザクションを...
データの旧バージョンは一時領域に保持される。
+他のアプリケーションがそのデータに対する読み取り要求をす...
一時領域に保持された旧バージョンのデータを取り出す。
+更新トランザクションがコミットされると、一時領域の旧バー...
アプリケーションはテーブル上の新バージョンのデータを見る...
**ロック法 [#cf148e22]
SQL Server(の既定の設定)では、データの読み取り一貫性の...
+あるアプリケーションが更新トランザクションを開始すると、~
テーブル内の更新レコードには排他ロック(X)が保持される。
+他のアプリケーションがそのレコードに対する読み取り要求を...
以外の読み取りトランザクションでは、レコードを取り出すこ...
+更新トランザクションがコミットされると、排他ロック(X)...
アプリケーションは更新されたレコードを見ることになる。
**多バージョン法とロック法 [#y54096e5]
-「多バージョン法」を採用しているデータベースには、Oracle...
-「ロック法」を採用しているデータベースにはSQL Server、DB...
一般的な同時実行制御方式は「ロック法」と言われていたが、
近年は、「多バージョン法」の同時実行制御に対応したDBMSも...
#ref(1_LockAndMVCC.png,left,nowrap,多バージョン法とロック...
**アプリケーション開発にて問題となる点 [#vd5cf469]
多バージョン法と、ロック法の最も大きな違いは、更新中のデ...
Oracleでは、多バージョン法により、一時領域に保持された、...
>つまり、Oracleでは、読み取るデータが更新中であっても検索...
これに対し、SQL Serveでは、ロック法による同時実行制御のた...
読み取るデータが更新中の場合は、すでにそのデータに排他ロ...
共有ロックをかけることができない。
>つまり、SQL Serverでは、更新中のデータに読み手はアクセス...
このような、実装の特徴を理解していないと、アプリケーショ...
パフォーマンス劣化やデッドロックなどのトラブルに見舞われ...
*トランザクション分離レベル [#z75a5422]
**サポートされる分離レベル [#z48ca945]
-トランザクションの分離レベルとは、トランザクションを、他...
--分離レベルが高くなるとデータの一貫性は確保されるが、ア...
--分離レベルが低くなるとアプリケーションの同時実効性は向...
-Oracleは、
--コミット読み取り(Read Committed)
--直列可能(Serializable)
>の2つをサポートしている。
-それに対し、SQL Serverは、~
ANSI/ISO標準のトランザクション分離レベルをすべてサポート...
--未コミット読み取り(Uncommitted Read)
--コミット読み取り(Read Committed)
--繰り返し可能読み取り(Repeatable Read)|未サポート
--直列可能(Serializable)
-OracleもSQL Serverもデフォルトの~
トランザクション分離レベルはコミット読み取り(Read Committ...
以下に、OracleとSQL Serverがサポートする~
ANSI/ISO標準のトランザクション分離レベルの対応表を示す。
|ANSI・ISO標準のトランザクション分離レベル|Oracle|SQL Ser...
|未コミット読み取り(Uncommitted Read)|未サポート|○|
|コミット読み取り(Read Committed)|○(default)|○(default)|
|繰り返し可能読み取り(Repeatable Read)|未サポート|○|
|直列可能(Serializable)|○|○|
**分離レベルと、同時実行における3つの問題 [#c18a508a]
ANSI/ISO SQL規格は、 同時に実行されるトランザクションの分...
次に、この3つの問題点について説明する(同時実行における...
***ダーティ・リード [#t8aa7375]
同時に実行されている、~
まだコミットされていないトランザクションが~
書き込んだデータを読み込んでしまう。
#ref(2_DirtyRead.png,left,nowrap,DirtyRead)
.png [詳細] .png [詳細] file
***反復不可能読み取り [#tc130c6f]
トランザクションが過去に読み込んだデータをもう一度読み込...
他のトランザクションによって書き換えられ、コミットされた...
#ref(3_RepeatableRead.png,left,nowrap,RepeatableRead)
***ファントム・リード [#s3fdbf36]
トランザクションが、ある行の集合を返す検索条件で問い合わ...
別のトランザクションがその問い合わせ条件を満たす行を追加...
#ref(4_PhantomRead.png,left,nowrap,PhantomRead)
***3つの問題点の対応表 [#zc99c0a3]
|ANSI・ISO標準のトランザクション分離レベル|ダーティ・リー...
|未コミット読み取り(Uncommitted Read)|有|有|有|
|コミット読み取り(Read Committed)|-|有|有|
|繰り返し可能読み取り(Repeatable Read)|-|-|有|
|直列可能(Serializable)|-|-|-|
***分離レベルの実現方式 [#ma87eb92]
本節では、OracleとSQL Serverの分離レベルの実現方式ついて...
-Oracleでは、参照するデータのバージョンを選択することによ...
コミット済み読み取り(Read Committed)・直列化(Serializable...
-SQL Serverでは、分離レベルの設定により、~
データ参照時に適用されるロックの期間、ロックの種類が変更...
|ANSI/ISO標準トランザクション分離レベル|Oracle|SQL Server|h
|未コミット読み取り(Uncommitted Read)|更新中のデータは、...
|コミット読み取り(Read Committed)|~|データの読み取りに、...
|繰り返し可能読み取り(Repeatable Read)|~|トランザクショ...
|直列可能(Serializable)|自トランザクションの開始以降に開...
**更新データの消失 [#b0a95486]
次に、『更新データの消失』の対処法と、分離レベルとの関係...
2つのトランザクションが行を読み取り、それぞれ、行を更新...
-最初に更新したトランザクションの変更は、後から更新したト...
-最初に更新したトランザクションの更新は、気が付かないうち...
#ref(5_LossOfDataUpdate.png,left,nowrap,LossOfDataUpdate)
『更新データの消失』は、以下の方法で回避できる。
-ロックを使用しないOracleデータベースでは、
--更新対象のデータには、明示的に更新ロックをホールドで掛...
--トランザクションの分離レベルに、直列化(Serializable)を...
『レコードに対する変更が、自トランザクションの開始時にす...
>という制御を使用する。
-SQL Serverでは、
--繰り返し可能読み取り(Repeatable Read)以上の分離レベルで...
対象データに共有ロックをホールドで掛ける。
--コミット済み読み取り(Read Committed)の分離レベルで、~
明示的に更新ロックをホールドで掛ける。
*ロック・メカニズムの詳細 [#pecf549e]
本章では、ロックの互換性と、更新ロックについて詳しく説明...
**ロックの互換性 [#vca71466]
基本的なロックの互換性については以下の表に示す通りである。
Oracleに関しては、参照時にロックを掛けることが無いため、
-「共有ロックが存在しない」
--⇒ 「共有ロックと排他ロックの違いが無い」
---⇒ 「排他ロックのみ存在する」
と言うことになる。
|/|>|>|既にかけられているモード|h
|要求されたモード|共有(S)|更新(U)|排他(X)|
|共有(S)|○|○|×|
|更新(U)|○|×|×|
|排他(X)|×|×|×|
※ SQL Serverには、[[インテントロック>#e4866bc5]]等、特殊...
ユーザが制御するものでは無いため、ここでは割愛する。
**更新ロックの役割 [#h6c1ac80]
OracleとSQL Serverの更新ロックは、双方『更新データの消失...
SQL Serverの場合、『更新データの消失』の防止は、共有ロッ...
このため、SQL Serverの更新ロックは『デッドロック』防止の...
*トランザクションの実装方式 [#fcfbae68]
前述の、「多バージョン法」・「ロック法」の、~
トランザクション設計 ~ 実装方式の決定フローチャートを以...
※「多バージョン法」の方がディシジョン(判断)が浅く、設計...
**多バージョン法 [#xf9852ee]
WEBのような、DBMSトランザクションを使用できない方式で、U...
┃
┣ YES ⇒ タイムスタンプを使用せざるを得ない(楽観方式)。
┃
┗ NO ⇒ DBMSトランザクションを使用することができる。
┃
┗ ⇒ 排他方式に、楽観方式を採用する?
┃
┣ YES ⇒ 分離レベルを直列化(Serializab...
┃
┗ NO ⇒ 更新前提の読み取りに、明示的に...
※ 更新ロックの競合時、待機するか、待機しないかを設定する...
**ロック法 [#t7f79038]
WEBのような、DBMSトランザクションを使用できない方式で、...
┃
┣ YES ⇒ タイムスタンプを使用せざるを得ない。
┗ NO ⇒ DBMSトランザクションを使用することができる。
┃
┗ ⇒ DBMSトランザクションを使用できるがDBに負荷を...
┃
┣ YES ⇒ コミット済み読み取り(Read Committ...
┗ NO ⇒ 特に問題が無い場合は、DBMSトランザ...
┃
┗ ⇒ 排他方式に、楽観方式を採用す...
┃
┣ YES ⇒ コミット済み読み取...
┃ タイムスタンプを...
┃
┗ NO ⇒ 悲観方式を、簡単に...
┃
┣ YES ⇒ 繰り返し...
┃ 参照処...
┗ NO ⇒ コミット...
更新前...
SQL Server では、繰り返し可能読み取り(Repeatable Read)以...
*SQL Serverでの多バージョン法のサポート [#we9e7704]
SQL Server2005からは、多バージョン法を使用した、同時実行...
多バージョン法を使用した、同時実行制御(MVCC)を使用する...
**2つの方法 [#kc2d8dc3]
***方法1:READ_COMMITTED_SNAPSHOT [#a0c274ec]
READ_COMMITTED_SNAPSHOT は、Oracleでのデフォルトの動作 と...
ステートメント発行時点での正しいデータを参照できることを...
***方法2:スナップショット分離レベル [#n60ad904]
スナップショット分離レベルは、OracleのSerializableの分離...
トランザクション発行時点での正しいデータを参照できること...
**設定方法 [#n1fca193]
上記の多バージョン法を使用した、同時実行制御(MVCC)はデ...
利用の際は、DBMSへ下記の設定が必要になる。
***設定1:READ_COMMITTED_SNAPSHOT [#g3f85ca5]
以下のようにデータベースに対して READ_COMMITTED_SNAPSHOT ...
ALTER DATABASE データベース名
SET READ_COMMITTED_SNAPSHOT ON
***設定2:スナップショット分離レベル [#ocaa8477]
以下のようにデータベースに対して ALLOW_SNAPSHOT_ISOLATION...
ALTER DATABASE データベース名
SET ALLOW_SNAPSHOT_ISOLATION ON
詳しくは、以下のドキュメントを参照のこと。
-SQL Server 2005 Tips and Tips > 第2回 排他ロックにブロ...
http://www.microsoft.com/japan/sqlserver/2005/ssj/tips/02...
*SQLServerのロック法と多バージョン法の比較 [#q9fc2610]
-ロック法が既定のモードなのでロック法の方が多い気がします...
多バージョン法が使えないという情報も聞きません。
-昔、中の人にロック法と多バージョン法のどっちに自信あるの...
と聞いた事がありますが、回答無しでした(まぁ、あたりまえ...
**トレード・オフを考慮して使い分ける [#ed97e0e7]
調べてみましたが、以下のトレード・オフを考慮して使い分け...
-ロック法と多バージョン方を比較すると、多バージョン方は、
--ブロッキングやデッドロックが発生し難くなるが、
--TEMPDB を使用し、処理のオーバヘッドも大きくなる。
>ということのようです。
-ちなみに、デフォルトは、
--SQL Server では READ_COMMITTED_SNAPSHOT がデフォルトで ...
--SQL Azure では、READ_COMMITTED_SNAPSHOT がデフォルトで ON
>だそうです。
**参考 [#e979aa18]
あまり情報がありませんでしたが、以下の情報が非常に参考に...
-SQL Server の読み取り一貫性とロック|システム開発のブロ...
https://bellsoft.jp/blog/system/detail_586
*その他のトピック [#x4baac76]
**インテントロック [#e4866bc5]
より粒度の低いロックリソースにロックを保持していることを...
内部仕様(内部システム)で使用されるため、外部仕様として...
-ロックマネージャは、単に一つのロックリソースに対してロッ...
コレだけでは、ロックの互換性から、テーブルに共有ロックを...
-インテントロックはコレを防ぐため、更新時、行に排他ロック...
この場合、テーブルに共有ロックがかかっていれば、行に排他...
-参考
--インテントロックとは? – Microsoft SQL Server Japan Sup...
https://blogs.msdn.microsoft.com/jpsql/2012/06/27/609/
*参考 [#mf1b9e3e]
**[[SQL Server でのロック・タイムアウト]] [#f6c7f906]
**[[SQL Server のロックのエスカレーション]] [#k5e5d1dd]
**[[SQL Server でのデッドロック]] [#i715456a]
----
Tags: [[:データアクセス]], [[:SQL Server]], [[:ADO.NET]]
ページ名: