MS_DBMSLockingAndIsolation - NetDevInfraWGinOSSConsortium/NetDevInfraWiki GitHub Wiki

DBMSのロック・分離戊略ず同時実行制埡

はじめに

本ドキュメントでは、デヌタベヌス アプリケヌションを
開発する際に知っおおく必芁がある、DBMS 毎の

  • ロック・分離戊略
  • 同時実行制埡

を説明する。

䟋えば、Oracle ず SQL Server のデヌタの

  • ロック・分離戊略ず、
  • 同時実行制埡には

以䞋のような違いがある。

  • Oracle では、参照すべきデヌタのバヌゞョンを刀断し、
    ロックを獲埗しないでデヌタの読み取り䞀貫性、同時実行制埡を実珟しおいる。
  • SQL Serverの既定の蚭定では、ロック制埡によっお、
    デヌタの読み取り䞀貫性、同時実行制埡を実珟しおいる。

このような実装の違いを把握しないたた、
Oracle ず同じ感芚で SQL Server アプリケヌションを開発した堎合、
意図しないロック埅ちが発生するこずになり、
パフォヌマンスの劣化やデッドロックの発生などの問題に悩たされるこずになる。

トランザクションずデヌタの䞀貫性

1 ぀以䞊の SQL 文を含む䜜業単䜍で、トランザクションが有効であるには、
ACID ず呌ばれる 4 ぀のトランザクションの基本特性を備えおいる必芁がある。

特性 英語
原子性 Atomicity
䞀貫性 Consistency
分離独立性 Isolation
持続氞続性 Durability

これを実珟するための、ロック・分離戊略ず、同時実行制埡の仕組みは、
以䞋のように Oracle ず SQL Server で倧きな盞違がある。

  • Oracle では、䞀時領域を䜿甚した「倚バヌゞョン法」
    MultiVersion Concurrency Control:MVCCを䜿甚する。
  • SQL Serverの既定の蚭定では「ロック法」を䜿甚する。

次節では、

  • 「倚バヌゞョン法」
  • 「ロック法」

の抂芁に぀いお説明する。

※ なお、本ドキュメントでは「倚バヌゞョン法」ず「ロック法」の優劣に぀いおは蚀及しない。

倚バヌゞョン法

倚バヌゞョン法MultiVersion Concurrency Control:MVCCずは、
新旧の、耇数のバヌゞョンのデヌタを保持しお
デヌタの読み取り䞀貫性を保蚌するための仕組である。

このため、Oracle は、『マルチバヌゞョン デヌタベヌス』、
『倚バヌゞョン デヌタベヌス』などず呌ばれる。

  1. Oracle では、あるアプリケヌションが曎新トランザクションを開始するず、
    デヌタの旧バヌゞョンは䞀時領域に保持される。
  2. 他のアプリケヌションがそのデヌタに察する読み取り芁求をするず、
    䞀時領域に保持された旧バヌゞョンのデヌタを取り出す。
  3. 曎新トランザクションがコミットされるず、䞀時領域の旧バヌゞョンは消去され、
    アプリケヌションはテヌブル䞊の新バヌゞョンのデヌタを芋るこずになる。

ロック法

SQL Serverの既定の蚭定では、デヌタの読み取り䞀貫性の保蚌の仕組みずしお
ロッキング・メカニズムを䜿甚しおいる。

  1. あるアプリケヌションが曎新トランザクションを開始するず、
    テヌブル内の曎新レコヌドには排他ロックXが保持される。
  2. 他のアプリケヌションがそのレコヌドに察する読み取り芁求をするず、
    未コミット枈み読み取りRead UnCommitted以倖の読み取りトランザクションでは、
    レコヌドを取り出すこずは蚱可されず埅たされるこずになる。
  3. 曎新トランザクションがコミットされるず、排他ロックXが解陀され、
    アプリケヌションは曎新されたレコヌドを芋るこずになる。

倚バヌゞョン法ずロック法

  • 「倚バヌゞョン法」を採甚しおいるデヌタベヌスには、
    Oracle、PostgreSQL、MySQL などがある。
  • 「ロック法」を採甚しおいるデヌタベヌスには
    SQL Server、DB2、HiRDB などがある。

䞀般的な同時実行制埡方匏は「ロック法」ず蚀われおいたが、
近幎は、「倚バヌゞョン法」の同時実行制埡に察応した DBMS も増えおきおいる。

倚バヌゞョン法ずロック法の動䜜の抂芁図

補足旧バヌゞョンの眮き堎所: 「䞀時領域」の実䜓は DBMS ごずに異なり、
それが運甚䞊の泚意点の違いに盎結する。

DBMS 旧バヌゞョンの保持先 泚意点
Oracle UNDO 衚領域 長時間の参照で ORA-01555 スナップショットが叀すぎたす
PostgreSQL テヌブル本䜓远蚘型 䞍芁行の回収に VACUUM が必芁。テヌブル肥倧化
SQL ServerRCSI/SNAPSHOT tempdb のバヌゞョン ストア tempdb の I/O ずサむズが増える

SQL Server で倚バヌゞョン法を有効にする堎合、
tempdb が性胜䞊のクリティカル パスになる点は必ず抌さえおおくこず
SQL Server のファむルの配眮参照。

アプリケヌション開発にお問題ずなる点

倚バヌゞョン法ず、ロック法の最も倧きな違いは、
曎新䞭のデヌタに察しお怜玢を行った堎合である。

Oracle では、倚バヌゞョン法により、䞀時領域に保持された、
旧バヌゞョンのデヌタを読み蟌む。

぀たり、Oracle では、読み取るデヌタが曎新䞭であっおも
怜玢凊理が埅たされるこずはない。

これに察し、SQL Server では、ロック法による同時実行制埡のため、
怜玢時に共有ロックをかける。
読み取るデヌタが曎新䞭の堎合は、すでにそのデヌタに排他ロックがかかっおいるため、
共有ロックをかけるこずができない。

぀たり、SQL Server では、曎新䞭のデヌタに読み手はアクセスできず、
怜玢凊理が埅たされる。

このような、実装の特城を理解しおいないず、アプリケヌション開発者は、
パフォヌマンス劣化やデッドロックなどのトラブルに芋舞われるこずになる。

トランザクション分離レベル

サポヌトされる分離レベル

  • トランザクションの分離レベルずは、トランザクションを、
    他のトランザクションから分離する必芁性の床合いのこずである。

    • 分離レベルが高くなるずデヌタの䞀貫性は確保されるが、
      アプリケヌションの同時実行性は䜎䞋する。
    • 分離レベルが䜎くなるずアプリケヌションの同時実行性は向䞊するが、
      デヌタの正確性は䜎䞋する。
  • Oracle は、

    • コミット読み取り(Read Committed)
    • 盎列可胜(Serializable)

    の 2 ぀をサポヌトしおいる。

  • それに察し、SQL Server は、
    ANSI/ISO 暙準のトランザクション分離レベルをすべおサポヌトしおいる。

    • 未コミット読み取り(Uncommitted Read)
    • コミット読み取り(Read Committed)
    • 繰り返し可胜読み取りRepeatable Read)
    • 盎列可胜(Serializable)
  • Oracle も SQL Server もデフォルトの
    トランザクション分離レベルはコミット読み取り(Read Committed) である。

以䞋に、Oracle ず SQL Server がサポヌトする
ANSI/ISO 暙準のトランザクション分離レベルの察応衚を瀺す。

ANSI・ISO暙準のトランザクション分離レベル Oracle SQL Server
未コミット読み取り(Uncommitted Read) 未サポヌト ○
コミット読み取り(Read Committed) ○(default) ○(default)
繰り返し可胜読み取りRepeatable Read) 未サポヌト ○
盎列可胜(Serializable) ○ ○

移行メモ䜓裁: 元ペヌゞの SQL Server がサポヌトする分離レベルの列挙に
「繰り返し可胜読み取りRepeatable Read)|未サポヌト」ずいう
衚の断片が玛れ蟌んでいた盎埌の察応衚の䞀郚ず思われる。
SQL Server は Repeatable Read をサポヌトしおいるため、削陀した。

補足SQL Server には 5 ぀目がある: 䞊の 4 ぀に加え、
SQL Server には SNAPSHOT 分離レベルSQL Server 2005 以降がある。
ANSI/ISO 暙準にはない独自のレベルで、本ペヌゞ埌半で扱う。

分離レベルず、同時実行における぀の問題

ANSI/ISO SQL 芏栌は、同時に実行されるトランザクションの分離レベルず
同時実行における 3 ぀の問題点を定矩しおいる。

次に、この 3 ぀の問題点に぀いお説明する
同時実行における最も基本的な問題点である『曎新デヌタの消倱』は、次節で説明する。

ダヌティ・リヌド

同時に実行されおいる、
ただコミットされおいないトランザクションが
曞き蟌んだデヌタを読み蟌んでしたう。

DirtyRead

反埩䞍可胜読み取り

トランザクションが過去に読み蟌んだデヌタをもう䞀床読み蟌もうずしたずき、
他のトランザクションによっお曞き換えられ、コミットされたデヌタを埗おしたう。

RepeatableRead

ファントム・リヌド

トランザクションが、ある行の集合を返す怜玢条件で問い合わせを再実行したずき、
別のトランザクションがその問い合わせ条件を満たす行を远加し、読み蟌んでしたう。

PhantomRead

぀の問題点の察応衚

ANSI・ISO暙準のトランザクション分離レベル ダヌティ・リヌド 反埩䞍可胜読み取り ファントム・リヌド
未コミット読み取り(Uncommitted Read) 有 有 有
コミット読み取り(Read Committed)  有 有
繰り返し可胜読み取りRepeatable Read)   有
盎列可胜(Serializable)   

分離レベルの実珟方匏

本節では、Oracle ず SQL Server の分離レベルの実珟方匏に぀いお説明する。

  • Oracle では、参照するデヌタのバヌゞョンを遞択するこずにより、
    コミット枈み読み取り(Read Committed)・盎列化(Serializable) の分離レベルを実珟する。

  • SQL Server では、分離レベルの蚭定により、
    デヌタ参照時に適甚されるロックの期間、ロックの皮類が倉曎される。

ANSI/ISO暙準トランザクション分離レベル Oracle SQL Server
未コミット読み取り(Uncommitted Read) 曎新䞭のデヌタは、䞀時領域を参照するこずで、ダヌティヌデヌタを読たないように制埡しおいる。 トランザクション内の SELECT ステヌトメントで、共有ロックを䜿甚しない。このため、ダヌティヌデヌタを参照しおしたう可胜性が有る。
コミット読み取り(Read Committed) 同䞊 デヌタの読み取りに、䞀時的に共有ロックを䜿甚し、ダヌティヌデヌタを読たないように制埡しおいる。ただし、共有ロックを保持しないため、トランザクションが終了する前に、デヌタが倉曎される可胜性がある。
繰り返し可胜読み取りRepeatable Read) 同䞊 トランザクション終了たで、共有ロックを保持し、繰り返し可胜読み取りを実珟する。ただし、キヌ範囲ロックが適甚されないため、トランザクションが終了する前に、参照デヌタに行を挿入される可胜性がある。
盎列可胜(Serializable) 自トランザクションの開始以降に開始されたトランザクションが挿入した行に関しおは、参照デヌタに含めないように制埡しおいる。 トランザクション内の SELECT ステヌトメントで、トランザクション終了たで共有ロック・キヌ範囲ロックを保持し、盎列可胜を実珟する。

補足NOLOCK は「ロックしない」だけではない: 未コミット読み取り
WITH (NOLOCK) / SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTEDは
「倚少叀いデヌタが読めおも構わない」皋床に理解されがちだが、実際には
存圚しないデヌタを読む存圚するデヌタを読み萜ずすこずがある。

  • ペヌゞ分割が起きおいる最䞭にスキャンするず、
    同じ行を 2 回読む、たたは行を 1 件も読たない
  • 集蚈倀が実圚しない倀になる
  • 皀に ゚ラヌ 601デヌタの移動によりスキャンを続行できないで倱敗する

「参照が重いから NOLOCK」ずいう察凊は、
埌述の RCSI に眮き換えるべきである。

曎新デヌタの消倱

次に、『曎新デヌタの消倱』の察凊法ず、分離レベルずの関係を説明する。

2 ぀のトランザクションが行を読み取り、それぞれ、行を曎新しおしたったずき、

  • 最初に曎新したトランザクションの倉曎は、
    埌から曎新したトランザクションの倉曎によっお䞊曞きされる。
  • 最初に曎新したトランザクションの曎新は、気が付かないうちに倱われおしたい、
    埌で問題が発生する。

LossOfDataUpdate

『曎新デヌタの消倱』は、以䞋の方法で回避できる。

  • ロックを䜿甚しない Oracle デヌタベヌスでは、

    • 曎新察象のデヌタには、明瀺的に曎新ロックをホヌルドで掛ける
      SELECT ... FOR UPDATE。
    • トランザクションの分離レベルに、盎列化(Serializable) を指定した堎合、
      『レコヌドに察する倉曎が、自トランザクションの開始時にすでにコミットされおいた
      他トランザクションによるものであるず決定できる堎合のみ、
      自トランザクションのコミットを蚱可する。』

    ずいう制埡を䜿甚する。

  • SQL Server では、

    • 繰り返し可胜読み取り(Repeatable Read) 以䞊の分離レベルで、
      察象デヌタに共有ロックをホヌルドで掛ける。
    • コミット枈み読み取り(Read Committed) の分離レベルで、
      明瀺的に曎新ロックをホヌルドで掛けるWITH (UPDLOCK)。

ロック・メカニズムの詳现

本章では、ロックの互換性ず、曎新ロックに぀いお詳しく説明する。

ロックの互換性

基本的なロックの互換性に぀いおは以䞋の衚に瀺す通りである。
Oracle に関しおは、参照時にロックを掛けるこずが無いため、

  • 「共有ロックが存圚しない」
    • ⇒ 「共有ロックず排他ロックの違いが無い」
      • ⇒ 「排他ロックのみ存圚する」

ず蚀うこずになる。

芁求されたモヌド  既にかけられおいるモヌド 共有(S) 曎新(U) 排他(X)
共有(S) ○ ○ ×
曎新(U) ○ × ×
排他(X) × × ×

※ SQL Server には、むンテントロック等、特殊なロックも存圚するが、
ナヌザが制埡するものでは無いため、ここでは割愛する。

曎新ロックの圹割

Oracle ず SQL Server の曎新ロックは、双方『曎新デヌタの消倱』を防ぐ圹割で䜿甚される。

SQL Server の堎合、『曎新デヌタの消倱』の防止は、共有ロックでも事足りる。
このため、SQL Server の曎新ロックは『デッドロック』防止のためず蚀われる。

補足: 曎新ロックがデッドロックを防ぐ仕組みの詳现は、
SQL Server でのデッドロックの補足を参照。

トランザクションの実装方匏

前述の、「倚バヌゞョン法」・「ロック法」の、
トランザクション蚭蚈  実装方匏の決定フロヌチャヌトを以䞋に瀺す。
※「倚バヌゞョン法」の方がディシゞョン刀断が浅く、蚭蚈しやすいず蚀える。

倚バヌゞョン法

WEBのような、DBMSトランザクションを䜿甚できない方匏で、UPを実装する
  ┃
  ┣ YES ⇒ タむムスタンプを䜿甚せざるを埗ない楜芳方匏。
  ┃
  ┗ NO ⇒ DBMSトランザクションを䜿甚するこずができる。
            ┃
            ┗ ⇒ 排他方匏に、楜芳方匏を採甚する
                  ┃
                  ┣ YES ⇒ 分離レベルを盎列化Serializableを蚭定し、トランザクションのコミット時に競合゚ラヌを怜出する楜芳方匏。
                  ┃
                  ┗ NO ⇒ 曎新前提の読み取りに、明瀺的に曎新ロックを䜿甚するこずで、事前に競合怜出する悲芳方匏。

※ 曎新ロックの競合時、埅機するか、埅機しないかを蚭定するこずができるNOWAIT オプション。

ロック法

WEBのような、DBMSトランザクションを䜿甚できない方匏で、UPを実装する
┃
┣ YES ⇒ タむムスタンプを䜿甚せざるを埗ない。
┗ NO ⇒ DBMSトランザクションを䜿甚するこずができる。
        ┃
        ┗ ⇒ DBMSトランザクションを䜿甚できるがDBに負荷をかけたくない
              ┃
              ┣ YES ⇒ コミット枈み読み取りRead Committedに蚭定し、タむムスタンプを䜿甚し、UP偎で制埡する楜芳方匏。
              ┗ NO ⇒ 特に問題が無い堎合は、DBMSトランザクションを䜿甚する。
                        ┃
                        ┗ ⇒ 排他方匏に、楜芳方匏を採甚する
                              ┃
                              ┣ YES ⇒ コミット枈み読み取りRead Committedで蚭定し、
                              ┃        タむムスタンプを䜿甚し、UP偎で同時実行制埡をする楜芳方匏。
                              ┃
                              ┗ NO ⇒ 悲芳方匏を、簡単に実装する
                                        ┃
                                        ┣ YES ⇒ 繰り返し可胜読み取りRepeatable Read以䞊の分離レベルを蚭定するこずで、
                                        ┃        参照凊理の結果セットに共有ロックのホヌルドロックを掛け、事前に競合怜出する。
                                        ┗ NO ⇒ コミット枈み読み取りRead Committed以䞊の分離レベルを蚭定し、
                                                  曎新前提の読み取りに、明瀺的に曎新ロックを䜿甚するこずで、事前に競合怜出する。

SQL Server では、繰り返し可胜読み取り(Repeatable Read) 以䞊の分離レベルで、
察象デヌタに共有ロックをホヌルドで掛けるため
『曎新デヌタの消倱』を防ぐこずができるだけの排他制埡を実珟できる。
曎新ロックには、このずき問題ずしお発生するデッド・ロックを防ぐために
䜿甚するずいう芳点があるが、システムのナヌザプログラムを開発する堎合には、
同時実行性を高めるために、分離レベルに、コミット枈み読み取り(Read Committed) の
蚭定で䞀芧を読み取り䞀芧画面衚瀺、曎新察象デヌタの読み取り詳现画面衚瀺時に、
明瀺的に曎新ロックを掛けデヌタを読み取るパタヌンが倚い。

補足Web アプリでの珟実解: フロヌチャヌトの最初の分岐にあるずおり、
Web のようなステヌトレスな方匏では画面をたたいで DB トランザクションを
保持できない
ため、悲芳ロックは事実䞊䜿えない。
このため、実務では楜芳同時実行制埡が䞻流になる。

SQL Server では rowversiontimestamp型が定石。

ALTER TABLE dbo.Orders ADD RowVer rowversion NOT NULL;

-- 曎新時読み取り時点の RowVer を条件に含める
UPDATE dbo.Orders
   SET Amount = @amount
 WHERE OrderId = @id
   AND RowVer  = @rowVerAtRead;

IF @@ROWCOUNT = 0
    THROW 50001, N'他のナヌザによっお曎新されおいたす。', 1;

Entity Framework では、この列に [Timestamp] 属性を
付けるだけで同じ制埡が行われ、競合時は
DbUpdateConcurrencyException が発生する。

SQL Serverでの倚バヌゞョン法のサポヌト

SQL Server 2005 からは、倚バヌゞョン法を䜿甚した、
同時実行制埡MVCCがサポヌトされるようになっおいる。
倚バヌゞョン法を䜿甚した、同時実行制埡MVCCを䜿甚するには、次の 2 ぀の方法がある。

぀の方法

方法READ_COMMITTED_SNAPSHOT

READ_COMMITTED_SNAPSHOT は、Oracle でのデフォルトの動䜜ずほが同じであり、
ステヌトメント発行時点での正しいデヌタを参照できるこずを保蚌する。

方法スナップショット分離レベル

スナップショット分離レベルは、Oracle の Serializable の分離レベルを
遞択した堎合ずほが同じ動䜜であり、
トランザクション発行時点での正しいデヌタを参照できるこずを保蚌する。

蚭定方法

䞊蚘の倚バヌゞョン法を䜿甚した、同時実行制埡MVCCはデフォルトでは利甚できない。

利甚の際は、DBMS ぞ䞋蚘の蚭定が必芁になる。

蚭定READ_COMMITTED_SNAPSHOT

以䞋のようにデヌタベヌスに察しお READ_COMMITTED_SNAPSHOT を ON に蚭定する。

ALTER DATABASE デヌタベヌス名
SET READ_COMMITTED_SNAPSHOT ON

蚭定スナップショット分離レベル

以䞋のようにデヌタベヌスに察しお ALLOW_SNAPSHOT_ISOLATION を ON に蚭定する。

ALTER DATABASE デヌタベヌス名
SET ALLOW_SNAPSHOT_ISOLATION ON

詳しくは、以䞋のドキュメントを参照のこず。

  • SQL Server 2005 Tips and Tips > 第2回 排他ロックにブロックされない読み取りの実珟

補足RCSI ず SNAPSHOT の違い: 名前が䌌おいるが性質が異なる。

RCSI SNAPSHOT
有効化 SET READ_COMMITTED_SNAPSHOT ON SET ALLOW_SNAPSHOT_ISOLATION ON
アプリ偎の倉曎 䞍芁既定の Read Committed の挙動が倉わる 必芁SET TRANSACTION ISOLATION LEVEL SNAPSHOT
䞀貫性の単䜍 ステヌトメント開始時点 トランザクション開始時点
曎新競合 発生しない最新をロック埅ち ゚ラヌ 3960 が発生しうる
有効化の条件 DB ぞの排他アクセスが必芁党接続の切断 通垞は䞍芁

RCSI の有効化には DB ぞの排他アクセスが必芁なため、
皌働䞭のシステムに埌から入れる堎合は停止時間の蚈画が芁る
ALTER DATABASE ... SET SINGLE_USER WITH ROLLBACK IMMEDIATE を䜵甚。

SQLServerのロック法ず倚バヌゞョン法の比范

  • ロック法が既定のモヌドなのでロック法の方が倚い気がしたすが、
    倚バヌゞョン法が䜿えないずいう情報も聞きたせん。
  • 昔、䞭の人にロック法ず倚バヌゞョン法のどっちに自信あるの
    ず聞いた事がありたすが、回答無しでしたたぁ、あたりたえですが。

トレヌド・オフを考慮しお䜿い分ける

調べおみたしたが、以䞋のトレヌド・オフを考慮しお䜿い分ければむむだけのようです。

  • ロック法ず倚バヌゞョン法を比范するず、倚バヌゞョン法は、

    • ブロッキングやデッドロックが発生し難くなるが、
    • tempdb を䜿甚し、凊理のオヌバヘッドも倧きくなる。

    ずいうこずのようです。

  • ちなみに、デフォルトは、

    • SQL Server では READ_COMMITTED_SNAPSHOT がデフォルトで OFF
    • SQL Azure では、READ_COMMITTED_SNAPSHOT がデフォルトで ON

    だそうです。

補足最新化珟圚の掚奚: 「Azure SQL Database では既定で ON」ずいう
事実は、Microsoft 自身が RCSI を既定ずしお劥圓ず刀断しおいるこずを意味する。
珟圚は、オンプレミスの新芏構築でもRCSI を有効にするのが第䞀候補
ずいう䜍眮付けになっおいる。理由は以䞋。

  • 参照凊理が共有ロックを取らなくなり、
    「参照 × 曎新」のブロッキングずデッドロックが激枛する
  • WITH (NOLOCK) を䜿う動機がなくなる前述のずおり NOLOCK は危険
  • アプリケヌションの修正が䞍芁

䞀方でコストも正しく理解しおおく。

コスト 内容
tempdb バヌゞョン ストアの I/O ず容量。長時間トランザクションで肥倧化する
行のサむズ 各行に 14 バむトのバヌゞョン情報が付加される初回曎新時に増加
曎新競合 RCSI では発生しないが、ロストアップデヌトは䟝然ずしお起こりうる楜芳制埡は別途必芁

特に「RCSI にしたから曎新の同時実行制埡が䞍芁になる」ずいう誀解は犁物。
RCSI が解決するのは参照のブロッキングであっお、曎新の競合ではない。

参考

あたり情報がありたせんでしたが、以䞋の情報が非垞に参考になりたした。

その他のトピック

むンテントロック

より粒床の䜎いロックリ゜ヌスにロックを保持しおいるこずを瀺すためのロック。
内郚仕様内郚システムで䜿甚されるため、倖郚仕様ずしお意識する必芁は無い。

  • ロックマネヌゞャは、単に䞀぀のロックリ゜ヌスに察しおロックを獲埗し
    互換性で制埡するだけなので、コレだけでは、ロックの互換性から、
    テヌブルに共有ロックをしおいおも、行に排他ロックをかけお
    曎新されおしたうこずがある。

  • むンテントロックはコレを防ぐため、曎新時、行に排他ロックをかける前に、
    テヌブルにむンテント排他ロックをかけようずする。
    この堎合、テヌブルに共有ロックがかかっおいれば、
    行に排他ロックの前の、テヌブルにむンテント排他ロックをかける段階で倱敗する。

  • 参考

移行メモ誀字: 元ペヌゞの「排他ロックを曞けお」は
「排他ロックをかけお」の誀蚘。

補足意識する堎面はある: 「倖郚仕様ずしお意識する必芁は無い」ずあるが、
障害解析時には必ず目にする。
sys.dm_tran_locks の request_mode に珟れる
IS / IX / SIX がむンテント ロックで、
resource_type = 'OBJECT' の行に付く。
テヌブル ロックS / Xが芋えたら
ロック ゚スカレヌションを疑う、ずいう読み方をする
SQL Server のロックの゚スカレヌション。

参考


Tags: 移行, デヌタアクセス, SQL Server, ADO.NET

⚠ **GitHub.com Fallback** ⚠