...

第5章 ロック 内容

by user

on
Category: Documents
24

views

Report

Comments

Transcript

第5章 ロック 内容
DB2 UDB (PC&Unix) デザイン・ガイド
ロック
第5章
ロック
お断り:当資料は、DB2 UDB V7.1(AIX,NT,OS2) をベースに作成されています。
<第1.00版>2001年3月
(C)日本IBMシステムズ・エンジニアリング(株) データシステム部
内容
1.ロックの必要性
2.ロックのしくみ
2−1.ロックの対象
2−2.ロックの保持期間
2−3.ロックの範囲
2−4.ロックのモード
2−5.ロックの互換性
2−6.ロックの変換
3.ロック・エスカレーション
4.ロック待機とロック・タイムアウト
5.デッドロック
6.ロックに関するモニタリング
7.Next Key Locking
8.ユーティリティーにおける排他制御
9.ロックを制御する指定
10.いろいろな機能とロック
11.Quiesce
12.ロックのまとめ
当資料の内容は、DB2 UDB V7.1を対象としたテスト結果からまとめたものです。
ロックの動作が将来にわたって不変であることは保証されないことを、ご了承下さい。
(C)日本IBMシステムズ・エンジニアリング(株) データシステム部
第5章( 1-2 )
DB2 UDB (PC&Unix) デザイン・ガイド
ロック
1.ロックの必要性
ロックの目的
マルチ・ユーザー環境でデータを共用するために、データへのアクセスを制御し、望ましくない
現象を発生させないようにするため
望ましくない現象とは
更新喪失/二重更新
未コミットデータの読取り
反復不能読取り
幻像読取り
ロックの制御はロック・
マネージャーが行う
EEE環境でのロック
ロックは特定のパーティションに対して行われるものであり、他のパーティションに直接影響を
与えない
(C)日本IBMシステムズ・エンジニアリング(株) データシステム部
解説:ロックの必要性
DB2は、コミットされたデータは保存され、コミットされていない変更は保存されないことを保証しなければなりません。
データが変更された場合、その変更が上書きされないことを保証し、変更後の内容が次のトランザクションから照会するができる必
要があります。
さらに、SELECTを行った時には、トランザクション終了まで、全行が使用可能であることを保証することが必要な時があります。
照会条件と一致している、新規に追加された行を検索することが要求される場合もあります。
管理者/プログラマー/ユーザーはこれらの状況を理解し、データの処理方法としてどのような状態が望まれているかを判断する必
要があります。
(C)日本IBMシステムズ・エンジニアリング(株) データシステム部
第5章( 3-4 )
DB2 UDB (PC&Unix) デザイン・ガイド
ロック
更新の紛失(Lost Updates)
ある更新処理による更新データが確定される前に、他の更新処理によ
り変更されてしまう
DB2ではこの現象は発生しない
Reservations
Flight
512
Seat
7C
512
7B
P_Name
...
...
...
更新プログラム1
更新プログラム2
Update Reservations
Set P-name = 'Instruct'
Where Flight = 512
and Seat = '7C'
and P_name is NULL
512
7C
?
Instruct ...
Update Reservations
Set P-name = 'Manager'
Where Flight = 512
and Seat = '7C'
and P_Name is NULL
512
7C Manager
...
2番目の変更が1番目の変更を上書き
(C)日本IBMシステムズ・エンジニアリング(株) データシステム部
解説:更新の紛失
更新喪失は、以下の場合に起こり得ます。
1. トランザクション1が、列の値を指定してレコードをselectする
2. トランザクション2が、列の値を指定して同じレコードをsel
e
c
t
する
3. トランザクション1が、レコードを更新する
4. トランザクション1は、レコードをロックしない
5. トランザクション2が、同じレコードを更新する
この場合、トランザクション1による更新は失わます。
DB2では更新喪失は起こり得ません。なぜなら、データの整合性を保証するためのロック・メカニズムを組み込んでいるからで
す。
(C)日本IBMシステムズ・エンジニアリング(株) データシステム部
第5章( 5-6 )
DB2 UDB (PC&Unix) デザイン・ガイド
ロック
未コミットデータへのアクセス
コミット前のデータを読み取ってしまい、更新データがロールバックされ
た場合には、読取りデータは実際とは異なるデータとなる
Reservations
Flight
512
Seat
7C
512
7B
...
...
P_Name
プログラム1
1
Update
Reservations
Set P-name =
'Instruct'
Where Flight = 512
and Seat = '7C'
and P_Name is NULL
3
プログラム2
2 Select seat
From Reservations
Where P-name is NULL
512
7C
Instruct
Roll back
4 正しくない結果セット
(C)日本IBMシステムズ・エンジニアリング(株) データシステム部
解説:未コミットデータへのアクセス
未コミットデータへのアクセスは次の状況で発生します。
1. トランザクション1が、レコードを更新する
2. トランザクション2が、非コミット読み取りを行う
述部の条件に合致しないために、ステップ1の更新行はSELECTされない
3. トランザクション1が,ロールバックを行う
4. トランザクション2は結果として、正しくない結果を得ることになる
(ロールバック後のデータは、検索条件に合致していたかもしれない。)
UNCOMMITTED READが望ましい場合もあります。
例:
予約システムで、すばやく可能な行をSELECTし、アサインし、確定は後で行ってもかまわない
今の状況をとりあえず確認したい
(C)日本IBMシステムズ・エンジニアリング(株) データシステム部
第5章( 7-8 )
DB2 UDB (PC&Unix) デザイン・ガイド
ロック
反復不可能読取り(Non Repeatable Reads)
1つの作業単位内で、同じSELECT文が実行された場合に、同じ照会
結果が保証されない
Reservations
Flight
512
Seat
7C
512
7B
...
...
P_Name
プログラム1
プログラム2
1
Select seat
From Reservations
Where P-name is NULL
and Flight = '512'
3
1のSELECT文を再度
実行すると、Seatが
'7C'の行は戻されない
512
7C
-------
512
7B
-------
2Update Reservations
Set P-name =
'Instruct'
Where Flight = 512
and Seat = '7C'
and P_Name is NULL
(C)日本IBMシステムズ・エンジニアリング(株) データシステム部
解説:反復不可能読み取り
反復可能読取りは、「同一作業単位内においては、SQLの再実行が一度以上行われた場合、毎回正確に同一な結果セットを返すこ
と」を保証します。反復不可能読み取りは、これを保証しません。
反復可能読取りはその結果セットを保証するために、SQL文の結果が変わってしまう insert / update / delete は許されません。
この例で、814便の席8Aが他の人にアサインされた場合、反復可能読み取りによる照会結果の保証はされなくなり、反復不可能
読み取りとなります。
(C)日本IBMシステムズ・エンジニアリング(株) データシステム部
第5章( 9-10 )
DB2 UDB (PC&Unix) デザイン・ガイド
ロック
幻像読取り(Phantom Reads)
同一作業単位内で、同じSELECT文を実行した場合に、他の更新処理
により条件に合致するようになったデータまで照会結果に入る
Reservations
Flight
512
Seat
7B
P_Name
512
7A
Dwaine
...
...
プログラム2
2 Update Reservations
Set P-name = 'NULL'
Where Flight = 512
and Seat = '7A'
and P_Name = 'Dwaine'
プログラム1
1 Select seat
From Reservations
Where P-name is NULL
512
7B
3 1のSQL文を再度実行すると、
7Aはアサイン可能
(C)日本IBMシステムズ・エンジニアリング(株) データシステム部
解説:幻像読み取り
幻像読取りとは、反復不可能読取りの一種で、 同一作業単位内において2回目の照会の際に、1回目と同じデータ+追加のデータ
を戻します。
例:
passenger名がNULLである席を照会
別のトランザクションが、別のレコードをNULLに更新
再びステートメントを実行すると、追加のレコードも返ってくる
アプリケーションの要件によっては、こういう結果が望ましい場合もあります。
(C)日本IBMシステムズ・エンジニアリング(株) データシステム部
第5章( 11-12 )
DB2 UDB (PC&Unix) デザイン・ガイド
ロック
2.ロックのしくみ
2-1.ロックの対象
2-2.ロックの保持期間
2-3.ロックの範囲
2-4.ロックのモード
2-5.ロックの互換性
2-6.ロックの変換
(C)日本IBMシステムズ・エンジニアリング(株) データシステム部
ブランク・ページです
第5章( 13-14 )
DB2 UDB (PC&Unix) デザイン・ガイド
ロック
2-1.ロックの対象
ロックの対象となるもの:行、表、表スペース
照会・更新のアプリケーション実行時には、行・表単位のロックが取得される
ユーティリティーの実行時には、行・表・表スペース単位のロックが取得される
索引にロックは取得しない
行ロックと表ロックの比較
アプリケーション要件により、ロックの単位を設定することが可能
ロック
CPU負荷
アプリケーションの同時
稼動性
用途
行ロック
ロックを取得・解放する回数が多くなるた
め、負荷は高い
ロックの範囲が狭いので、同時稼動性は
高い
-アプリケーションの同時稼動性を高めた
い場合
-ロックを取得する行数が少ない場合
表ロック
ロックを取得・解放する回数が少ないの
で、負荷は低い
ロックの範囲が広いので、同時稼動性は
低い
-表が照会専用の場合
-他のアプリケーションを待たせてでも、あ
るアプリケーションのみ先に処理を完了さ
せたい場合
(C)日本IBMシステムズ・エンジニアリング(株) データシステム部
ブランク・ページです
第5章( 15-16 )
DB2 UDB (PC&Unix) デザイン・ガイド
ロック
ロックの単位を制御
ロックの単位を表ごとに設定可能
ALTER TABLEステートメントの LOCKSIZEオプション
ROW :行単位でのロック(省略時値)
TABLE :表単位でのロック
プログラムから明示的に表ロックの取得が可能
LOCK TABLE 表名 IN SHARE MODE: 表に共用ロックを取得
LOCK TABKE 表名 IN EXCLUSIVE MODE: 表に排他ロックを取得
LOCKSIZEオプションとLOCK TABLEステートメントの比較
ロックを制御する方法
ALTER TABLE ...
LOCKSIZE xxxx
影響の範囲
設定の持続性
その表にアクセスする全トランザクション
永続的
考慮点
LOCK TABLE ...
IN xxxx MODE
単一のトランザクション
一時的
LOCK TABLE による活動化
COMMIT あるいは ROLLBACKによる非活
動化
表の存在する表スペースのポイント・イン・ 回復可能最短時間には影響を与えない
タイム回復の回復可能な最短時間に影響
を与える
(C)日本IBMシステムズ・エンジニアリング(株) データシステム部
解説:ロックの単位を制御
ALTER TABLEステートメントのLOCKSIZEオプションは、V5のFixPak3で使用可能です。表をアクセスするときに使用されるロックの
サイズを指定することが可能です。省略時では、表が作成されるときに、ロックサイズは行レベルロックを取るように設定されていま
す。ALTER TABLEステートメントで表を変更し、ロックの設定を表レベルにあげることができます。表レベルのロックを設定し、取得・
解放されるロックの数を減らすことにより、照会処理のパフォーマンスが向上する可能性があります。しかし、表全体にロックが取得
されるため、同時稼動性は落ちます。
一度、設定を可能にした後は、その表に関する後続のトランザクションが表にアクセスする時に使用されるロックのサイズは、指定し
たロックモードで処理されます。表定義におけるこのオプションを使用することで、通常のロック・エスカレーションの発生を押さえるこ
とにはなりません。また、LOCK TABLEステートメントは、表スペースのポイント・イン・タイム回復が可能であることに何も影響を与え
ないのに対して、ALTER TABLEステートメントは、ポイント・イン・タイムで回復可能な時点に関連します。
ROW
行ロックを取ることを意味します。表が作成されるときのロック・サイズの省略時値です。
TABLE
表ロックを取ることを意味します。適切な、共用または排他ロックが表に取られ、意図ロックは使用されません。この値を使用し、
取得が必要なロックの数を減らすことにより、照会のパフォーマンスを向上させる可能性があります。しかし、ロックは表全体に
取られるので、同時稼動性は落ちます。以下の場合には、表ロックを使用するほうが良いでしょう。
表が読み取りのみで、常にSロックが必要である。他のトランザクションがその表にSロックを取得することが可能であるた
め、表レベル・ロックはパフォーマンスを向上させます。
ある1人のユーザーが保守のために表にアクセスし、限られた時間内でXロックを取得します。その表にALTER TABLEによ
り表レベル・ロックを定義することにより、表レベルのXロックを取得可能にします。その人の作業が一旦終了してしまえば、
ALTER TABLEを使用して、行レベル・ロックを取得するように表の設定を戻すことができます。
(C)日本IBMシステムズ・エンジニアリング(株) データシステム部
第5章( 17-18 )
DB2 UDB (PC&Unix) デザイン・ガイド
ロック
2-2.ロックの保持期間
ロックの長さ
作業単位が完了(COMMI
T/ROLLBACK)するまで保持される
WITH HOLD付きのカーソルを使用した場合には、カーソル位置へのロックは外されない
ISOLATION=CSの照会処理では、カーソル位置のみにロックが取得される
カーソルをCLOSEしても、ロックははずれない
RR,RSのアプリケーションによるRead Lockについては、CLOSE CURSORのWITH RELEASEオプションを使用するこ
とにより、CLOSE時に解放することが可能
NWロックだけは瞬間ロックであり、作業単位を待たずに解放される
NWロックの解放を待つためにロック待機(LOCK_WAIT)することはない
NWロック:索引のあるユーザー表にINSERTを行った時に、索引キーの次の行に取られるNext Keyロック
11 1 2
1
10
2
3
9
4
8
7
(C)日本IBMシステムズ・エンジニアリング(株) データシステム部
ブランク・ページです
第5章( 19-20 )
6
5
DB2 UDB (PC&Unix) デザイン・ガイド
ロック
2-3.ロックの範囲
ISOLATION(分離)レベルによりロックが保持される範囲を設定
(注: * は対応するISO SQL Isolation Level )
RR (Repeatable Read):反復可能読み取り
(* Serializable)
RS (Read Stability):読み取り固定
(* Repeatable Read)
CS (Cursor Stability):カーソル固定 (省略時値) (* Read Committed)
UR (Uncommitted Read):未コミット読み取り
(* Read Uncommitted)
ISOLATIONレベルによる 照会処理時のロック取得の違い
RRの場合のロック取得行
Table1
col1
100
200
300
400
.....
.....
col2
A01
A02
A01
B00
.....
.....
col3
700
800
750
600
.....
.....
select col2 from table1
where col1 between 100 and 350
and col3 >= 750
A01
A02
A01
B00
700
800
750
600
検索行全てにロック
次の索引キーの行にもロック
RSの場合のロック取得行
結果行
200
300
100
200
300
400
200
300
A02 800
A01 750
A02 800
A01 750
結果行にロック
CSの場合のロック取得行
200
索引列
A02 800
URの場合のロック取得行
なし
(C)日本IBMシステムズ・エンジニアリング(株) データシステム部
解説:ロックの範囲
ISO標準とは、ISOLATIONレベルの名前が異なります。
(C)日本IBMシステムズ・エンジニアリング(株) データシステム部
第5章( 21-22 )
カーソル位置にロック
DB2 UDB (PC&Unix) デザイン・ガイド
ロック
ISOLATIONレベルの比較
照会処理時のロック取得
更新された行については、作業単位完了(COMMIT/ROLLBACK)までロックを取得する
照会行については、ISOLATIONによりロックの取得範囲と保持期間が異なる
ISOLATION
RR
RS
CS
UR
ロックの範囲
作業単位内で走査した全て
の行、および索引キーの次
の行
作業単位内で参照し
た結果行
カーソルがおかれた
行のみ
ロックを取得しない
未コミットデータへの
アクセス
×
×
×
〇
反復不可能読み取り
×
×
〇
〇
幻像読み取り
×
〇
〇
〇
照会行へのロック
(Read Lock)の保持
期間
他のアプリケーション
への影響
作業単位内
作業単位内
カーソルが次の行に
進むまで
更新時の照会処理
のロックはCSと同じ
作業単位内で走査した全て
の行への更新処理が不可能
同一作業単位内で実行され
たSELECT文には必ず同じ結
果行が戻される
多くの行ロックを取得し、
locklistの不足からロック・エ
スカレーションが発生する可
能性あり
カーソルがおかれた
行への更新処理は不
可能
コミット行のみを照会
する場合において最
高の同時稼動性
反復不可能読み取り
と幻像読み取りが発
生すること
更新時の照会処理
のロックはCSと同じ
長所
作業単位内で参照し
た結果行への更新処
理が不可能
高い同時稼動性と結
果行の保持
考慮点
幻像読み取りが発生
すること
ロックの負荷がない
同時稼動性が高い
更新処理時のロック
は、CSと同じ
DROP/CREATE中の
表・視点・索引には
アクセス不可能
(C)日本IBMシステムズ・エンジニアリング(株) データシステム部
解説:ISOLATIONレベルの比較
ISOLATIONの違いにより、ロックの動作は大きく異なります。アプリケーション要件に適したISOLATIONレベルを選択することが必要
です。
(C)日本IBMシステムズ・エンジニアリング(株) データシステム部
第5章( 23-24 )
DB2 UDB (PC&Unix) デザイン・ガイド
ロック
ISOLATIONレベルの選択
アプリケーションのタイプによるISOLATIONレベルの選択
アプリケーション要件により、ISOLATIONレベルを選択する
アプリケーションのタイプ
データの保持が要求される
データの保持が要求されない
Read-Write
Read-Only
RS
RR
CS
UR
(C)日本IBMシステムズ・エンジニアリング(株) データシステム部
ブランク・ページです
第5章( 25-26 )
DB2 UDB (PC&Unix) デザイン・ガイド
ロック
ISOLATIONレベルの設定
設定方法
埋め込みSQL
PREP/BINDコマンドのISOLATIONオプション (BIND時に指定しない場合には、PREP時の設定が有効となる)
CLI、ODBCアプリケーション
db2cli.iniファイルに設定する方法
TXNISOLATION = 1 2 8 16 32
( 1:UR、2:CS、8:RR、16:RS、32:NC *NCはAS/400版のみ )
アプリケーションで設定する方法
SQL_SetConnectAttr() のSQL_ATTR_TXN_ISOLATIONオプション または
SQL_SetStmtAttr() のSQL_ATTR_STMTTXN_ISOLATIONオプション UR: SQL_TXN_READ_UNCOMMITTED
CS: SQL_TXN_READ_COMMITED
RS: SQL_TXN_REPEATABLE_READ
RR: SQL_TXN_SERIALIZABLE
NC: SQL_TXN_NOCOMMIT
JDBCアプリケーション
Connection.TRANSACTION_READ_UNCOMMITED = Uncommitted Read(非コミット読取り)
Connection.TRANSACTION_READ_COMMITTED = Cursor Stability(カーソル固定)
Connection.TRANSACTION_REPEATABLE_READ = Read Stability(読み取り固定)
Connection.TRANSACTION_SERIALIZABLE = Repeatable Read(反復可能読取り)
Connection.TRANSACTION_NONE = DB2 UDBでは、サポートされておらず、指定するとエラー
CLP(コマンド行プロセッサー)
CHANGE ISOLATION TO [ CS | RR | RS | UR | NC ]
(C)日本IBMシステムズ・エンジニアリング(株) データシステム部
ブランク・ページです
第5章( 27-28 )
DB2 UDB (PC&Unix) デザイン・ガイド
ロック
ISOLATIONレベルの確認
確認方法
SYSCAT.PACKAGES表のISOLATION列を参照する
(例) PKGNAMEにはパッケージ名、PKGSCHEMAにはパッケージのスキーマ名を英大文字で指定
SELECT ISOLATION FROM SYSCAT.PACKAGES WHERE PKGNAME='xxxxx' AND PKGSCHEMA='yyyyy'
db2bfdコマンドによりバインド・ファイルのヘッダー部分を画面出力する
(例) -bオプションにより、バインド・ファイルのヘッダー部分が表示可能
db2bfd -b ファイル名.bnd
画面出力例: Isolationの部分のみを抜粋
isol_value
Isolation option
:2: Uncommitted Read (Defined)
(C)日本IBMシステムズ・エンジニアリング(株) データシステム部
解説:ISOLATIONレベルの確認
db2bf
dコマンドにより、バインド・ファイルの内容を見ることができます。バインド時に指定されたオプションを確認する際に有効で
す。
db2bfd -h によりヘルプ画面(テキスト)を表示することができます。
<ヘルプの出力>db2bfd -h
Usage: db2bfd [ [-b] [-h] [-s] [-v] ] <filespec>
Where: <filespec> is a bind file
Options: -b = display bind file header
-h = display this information
-s = display SQL statements
-v = display host variable declarations
(C)日本IBMシステムズ・エンジニアリング(株) データシステム部
第5章( 29-30 )
DB2 UDB (PC&Unix) デザイン・ガイド
ロック
2-4.ロックのモード(1)
ロックのモード
排他制御を行うために、ロックに与えられた性質
ISOLATION(分離レベル)とアクセス・
パスによりロック・
モードが決まる
大別すると、共用(Shared)ロックと排他(Exclusive)ロック
共用(Shared))ロック :照会処理時に取得されるロック
排他(Exclusive)ロック:更新処理時に取得されるロック
取得済みのロック
排他(X)
取得要求
されたロック 共用(
S)
排他(X)
×
×
共用(S)
×
〇
〇:
取得可能 ×:
取得不可能
12のロック・モード
照会系のロック:IN(Intent None), IS(Intent Share), NS(Next Key Share), S(Share)
更新系のロック:IX(Intent Exclusive), SIX(Share with Intent Exclusive), U(Update),
NX(Next Key Exclusive), NW(Next Key Weak Exclusive), X(Exclusive), W(Weak Exclusive), Z(Superxclusive)
(*排他性の低い順に列挙)
(C)日本IBMシステムズ・エンジニアリング(株) データシステム部
ブランク・ページです
第5章( 31-32 )
DB2 UDB (PC&Unix) デザイン・ガイド
ロック
ロックのモード(2)
ロックのモードと処理
厳密には、さらにISOLATIONとアクセス・パスによりロックの対象とモードが変化する
表スペースにとられるロック:
I
N,I
S,I
X,Z
モード
対象
IN
IS
NS
S
IX
表
表
行
行
表
表
SIX
表
U
行
表
NX
行
NW
行
X
行
表
行
表
W
Z
このモードで表ロックが取得された時
の同一トランザクションからの行ロック
行ロックは取得しない
S,NS行ロック
行ロックは取得しない
照会行にS,NS,U
更新行にX
照会行にロックなし
更新行にX行ロック
行ロックは取得しない
行ロックは取得しない
このモードでロックが取得されるケース
URで照会時の表ロック
RR,RS,CSで照会時の表ロック
RS,CSで照会時の行ロック
RRで照会時の行ロック
表単位でロックが取得される場合の、照会時の表ロック
更新時またはFOR UPDATEカーソルでの照会時の表ロック
同一トランザクション内で、既にSを取得している表にIXロック、
または既にIXを取得している表にSロックの取得要求が発生し
た場合の表ロック
FOR UPDATEカーソルでの照会時の行または表ロック
更新時にはXロックに変わる
表単位でロックが取得される場合の、FOR UPDATEカーソルで
照会処理時の表ロック
カタログ表をUPDATE/DELETEした時に、更新行の次の行を
ロック(V5+FP7以降、V6)
ユーザー表ををUPDATE/DELETEした時に、更新行の次の行
をロック(V5+FP6)
カタログ表以外の表の索引にINSERTした行の次の行を瞬間的
にロック
更新時の行ロック
表単位でロックが取得される場合の、更新時の表ロック
カタログ表以外の表の索引にINSERTした時の行ロック
特定の状況下で取得 (表のALTER,DROP,REORG,
索引のCREATE,DROP)
(C)日本IBMシステムズ・エンジニアリング(株) データシステム部
解説:<参考>アクセス・パス&処理内容とロック・モードの関係
照会処理時のロック・モードは、アクセス・パスおよび処理内容により決定されます。
以下の表は、アクセス・パスおよび処理内容と、決定されるロック・モードとの関係を示しています。
Read-Onlly: 読み取りのみの照会処理の時
Intent to change: FOR UPDATE付きのカーソルによる照会処理の時
Change: INSERT/DELETE/UPDATEの際に行われる照会処理の時
(WHERE CURRENT CURSOR OFは指定されていない)
表スキャンのロック・モード
条件節なしの表スキャン
ISOLATION LEVEL
Intent to change
(FOR UPDATE付きカー
ソルでの照会時)
U(表)
Change
(更新時)
RR
Read-Only
(読み取りのみの
照会時)
S(表)
RS
CS
UR
IS(表)/NS(行)
IS(表)/NS(行)
IN(表)
IX(表)/U(行)
IX(表)/U(行)
IX(表)/U(行)
IX(表)/X(行)
IX(表)/X(行)
IX(表)/X(行)
ISOLATION LEVEL
Read-Only
(照会時)
Change
(更新時)
RR
S(表)
Intent to change
(FOR UPDATE付きカー
ソルでの照会時)
U(表)
RS
CS
IS(表)/NS(行)
IS(表)/NS(行)
IX(表)/U(行)
IX(表)/U(行)
IX(表)/U(行)
IX(表)/U(行)
UR
IN(表)
IX(表)/U(行)
IX(表)/U(行)
X(表)
条件節ありの表スキャン
(C)日本IBMシステムズ・エンジニアリング(株) データシステム部
第5章( 33-34 )
U(表)
DB2 UDB (PC&Unix) デザイン・ガイド
ロック
解説:<参考>アクセス・パス&処理内容とロック・モードの関係
索引スキャンのロック・モード
条件節なしの索引スキャン
ISOLATION LEVEL
Read-Only
(照会時)
Change
(更新時)
S(表)
Intent to change
(FOR UPDATE付きカー
ソルでの照会時)
IX(表)/U(行)
RR
RS
CS
UR
IS(表)/NS(行)
IS(表)/NS(行)
IN(表)
IX(表)/U(行)
IX(表)/U(行)
IX(表)/U(行)
IX(表)/X(行)
IX(表)/X(行)
IX(表)/X(行)
X(表)
1行のみヒットする索引スキャン(ユニーク索引を使用した索引スキャン)
ISOLATION LEVEL
Read-Only
(照会時)
RR
RS
CS
UR
IS(表)/S(行)
IS(表)/NS(行)
IS(表)/NS(行)
IN(表)
Intent to change
(FOR UPDATE付きカー
ソルでの照会時)
IX(表)/U(行)
IX(表)/U(行)
IX(表)/U(行)
IX(表)/U(行)
Change
(更新時)
IX(表)/X(行)
IX(表)/X(行)
IX(表)/X(行)
IX(表)/X(行)
(C)日本IBMシステムズ・エンジニアリング(株) データシステム部
解説:<参考>アクセス・パス&処理内容とロック・モードの関係
索引スキャンのロック・モード
範囲指定の条件節の索引スキャン
ISOLATION LEVEL
Read-Only
(照会時)
RR
RS
CS
UR
IS(表)/S(行)
IS(表)/NS(行)
IS(表)/NS(行)
IN(表)
Intent to change
(FOR UPDATE付きカー
ソルでの照会時)
IX(表)/S(行)
IX(表)/U(行)
IX(表)/U(行)
IX(表)/U(行)
Change
(更新時)
Intent to change
(FOR UPDATE付きカー
ソルでの照会時)
IX(表)/S(行)
IX(表)/U(行)
IX(表)/U(行)
IX(表)/U(行)
Change
(更新時)
IX(表)/X(行)
IX(表)/X(行)
IX(表)/X(行)
IX(表)/X(行)
条件節ありの索引スキャン
ISOLATION LEVEL
Read-Only
(照会時)
RR
RS
CS
UR
IS(表)/S(行)
IS(表)/NS(行)
IS(表)/NS(行)
IN(表)
(C)日本IBMシステムズ・エンジニアリング(株) データシステム部
第5章( 35-36 )
IX(表)/U(行)
IX(表)/U(行)
IX(表)/U(行)
IX(表)/U(行)
DB2 UDB (PC&Unix) デザイン・ガイド
ロック
解説:<参考>ISOLATION=RRに関するロック取得の確認
ISOLATION=RRについては、他のISOLATIONに比べて多少理解しづらい点がありますので、実際のテスト結果を参照してください。
テスト内容
Read-Only
1.条件なしの索引スキャン
2.条件ありの索引スキャン
Intent to change
3.FOR UPDATEつきカーソルによる表スキャン
4.FOR UPDATEつきカーソルによる索引スキャン
5.FOR UPDATEつきカーソルによる、ユニーク索引を使用した索引スキャン(1行のみヒットする)
6.FOR UPDATEつきカーソルによる索引スキャン + 副照会
(C)日本IBMシステムズ・エンジニアリング(株) データシステム部
解説:<参考>ISOLATION=RRに関するロック取得の確認:テスト1
dynexplnの出力
テスト環境
ISOLATION=RR
Package Name = UDBV61.DYNEXPLN
Prep Date = 2000/01/21
TESTTAB1表の列COL1に昇順の索引
Prep Time = 10:32:34
条件節なしの索引スキャン
Bind Timestamp = 2000-01-21-10.32.34.505994
テスト手順
Isolation Level
= Repeatable Read
Blocking
= Block Unambiguous Cursors
export DYNEXPLN_OPTIONS='isolation RR'
Query Optimization Class = 5
dynexpln -d sample -q "select min(col1) from
Partition Parallel
= No
Intra-Partition Parallel = No
testtab1
Function Path
= "SYSIBM", "SYSFUN", "UDBV61"
ロックの取得
-------------------- SECTION --------------------------------------表にSロック
Section = 1
SQL Statement:
考察
select min(col1)
列関数により索引列を指定しても、表ロックが取得
from testtab1
される
Estimated Cost
=1
Estimated Cardinality = 1
Access Table Name = UDBV61.TESTTAB1 ID = 4,9
| #Columns = 1
| Index Scan: Name = UDBV61.COL1IX ID = 2
| | Index Columns:
| | | 1: COL1 (Ascending)
| | #Key Columns = 0
| | | Start Key: Beginning of Index
| | | Stop Key: End of Index
| | Index-Only Access
| | Index Prefetch: None
| Lock Intents
| | Table: Share
| | Row : None
Aggregation
| Single Record
| Column Function(s)
Return Data to Application
| #Columns = 1
End of section
(C)日本IBMシステムズ・エンジニアリング(株) データシステム部
第5章( 37-38 )
DB2 UDB (PC&Unix) デザイン・ガイド
ロック
解説:<参考>ISOLATION=RRに関するロック取得の確認:テスト2
テスト環境
ISOLATION=RR
TESTTAB1表の列COL1に昇順の索引
条件節ありの索引スキャン
テスト手順
export DYNEXPLN_OPTIONS='isolation RR'
dynexpln -d sample -q "select min(col1) from
testtab1 where col1 between 3 and 6
ロックの取得
表にISロック,行にSロック
dynexplnの出力
Package Name = UDBV61.DYNEXPLN
Prep Date = 2000/01/21
Prep Time = 10:33:08
Bind Timestamp = 2000-01-21-10.33.08.854616
Isolation Level
= Repeatable Read
Blocking
= Block Unambiguous Cursors
Query Optimization Class = 5
Partition Parallel
= No
Intra-Partition Parallel = No
Function Path
= "SYSIBM", "SYSFUN", "UDBV61"
-------------------- SECTION --------------------------------------Section = 1
SQL Statement:
select min(col1)
from testtab1
where col1 between 3 and 6
Estimated Cost
=1
Estimated Cardinality = 1
Access Table Name = UDBV61.TESTTAB1 ID = 4,9
| #Columns = 1
| Index Scan: Name = UDBV61.COL1IX ID = 2
| | Index Columns:
| | | 1: COL1 (Ascending)
| | #Key Columns = 1
| | | Start Key: Inclusive Value
| | | | 1: 3
| | | Stop Key: Inclusive Value
| | | | 1: 6
| | Index-Only Access
| | Index Prefetch: None
| Lock Intents
| | Table: Intent Share
| | Row : Share
Aggregation
| Single Record
| Column Function(s)
Return Data to Application
| #Columns = 1
End of section
(C)日本IBMシステムズ・エンジニアリング(株) データシステム部
解説:<参考>ISOLATION=RRに関するロック取得の確認:テスト3
dynexplnの出力
テスト環境
ISOLATION=RR
Package Name = UDBV61.DYNEXPLN
DEPARTMENT表には索引なし
Prep Date = 2000/01/19
Prep Time = 11:00:21
範囲指定の条件節ありの、FOR UPDATEつきカー
ソルによる表スキャン
Bind Timestamp = 2000-01-19-11.00.21.753626
Isolation Level
= Repeatable Read
テスト手順
Blocking
= Block Unambiguous Cursors
export DYNEXPLN_OPTIONS='isolation RR'
Query Optimization Class = 5
dynexpln -d sample -q "select * from
Partition Parallel
= No
Intra-Partition Parallel = No
department where deptno > '000110' for update of
Function Path
= "SYSIBM", "SYSFUN", "UDBV61"
deptno
-------------------- SECTION --------------------------------------ロックの取得
Section = 1
SQL Statement:
表にUロック
select *
from department
where deptno > '000110'
for update of deptno
Estimated Cost
= 25
Estimated Cardinality = 10
Access Table Name = UDBV61.DEPARTMENT ID = 3,7
| #Columns = 5
| Relation Scan
| | Prefetch: Eligible
| Lock Intents
| | Table: Update
| | Row : None
| Sargable Predicate(s)
| | #Predicates = 1
Return Data to Application
| #Columns = 5
End of section
(C)日本IBMシステムズ・エンジニアリング(株) データシステム部
第5章( 39-40 )
DB2 UDB (PC&Unix) デザイン・ガイド
ロック
解説:<参考>ISOLATION=RRに関するロック取得の確認:テスト4
dynexplnの出力
テスト環境
ISOLATION=RR
Package Name = UDBV61.DYNEXPLN
Prep Date = 2000/01/21
TESTTAB2表の列COL1に昇順の索引
Prep Time = 09:37:49
条件節ありの、FOR UPDATEつきカーソルによる
Bind Timestamp = 2000-01-21-09.37.49.118243
索引スキャン
Isolation Level
= Repeatable Read
Blocking
= Block Unambiguous Cursors
テスト手順
Query Optimization Class = 5
export DYNEXPLN_OPTIONS='isolation RR'
Partition Parallel
= No
Intra-Partition Parallel = No
dynexpln -d sample -q "select * from testtab2
Function
Path
= "SYSIBM", "SYSFUN", "UDBV61"
where col1 = 1 for update of col1
-------------------- SECTION --------------------------------------ロックの取得
Section = 1
SQL Statement:
表にIXロック,行にSロック
select *
考察
from testtab2
where
col1 =1
FOR UPDATE付きカーソルによる照会でも、行にS
for update of col1
ロックを取得する
Estimated Cost
= 25
Estimated Cardinality = 3
Access Table Name = UDBV61.TESTTAB2 ID = 3,11
| #Columns = 2
| Index Scan: Name = UDBV61.TAB2COL1IX ID = 1
| | Index Columns:
| | | 1: COL1 (Ascending)
| | #Key Columns = 1
| | | Start Key: Inclusive Value
| | | | 1: 1
| | | Stop Key: Inclusive Value
| | | | 1: 1
| | Data Prefetch: Eligible
| | Index Prefetch: None
| Lock Intents
| | Table: Intent Exclusive
| | Row : Share
Return Data to Application
| #Columns = 2
End of section
(C)日本IBMシステムズ・エンジニアリング(株) データシステム部
解説:<参考>ISOLATION=RRに関するロック取得の確認:テスト5
dynexplnの出力
テスト環境
ISOLATION=RR
Package Name = UDBV61.DYNEXPLN
Prep Date = 2000/01/21
TESTTAB3表の列COL1に昇順のユニーク索引
Prep Time = 10:18:12
条件節ありの、FOR UPDATEつきカーソルによる
Bind Timestamp = 2000-01-21-10.18.12.110459
索引スキャン
Isolation Level
= Repeatable Read
Blocking
= Block Unambiguous Cursors
テスト手順
Query Optimization Class = 5
export DYNEXPLN_OPTIONS='isolation RR'
Partition Parallel
= No
Intra-Partition Parallel = No
dynexpln -d sample -q "select * from testtab3
Function
Path
= "SYSIBM", "SYSFUN", "UDBV61"
where col1 = 5 for update of col1
-------------------- SECTION --------------------------------------ロックの取得
Section = 1
SQL Statement:
表にIXロック,行にUロック
select *
考察
from testtab3
where col1=5
FOR UPDATE付きカーソルによる照会で、ユニーク
for update of col1
索引に対する索引スキャンであれば、行にUロック
を取得する
Estimated Cost
= 25
Estimated Cardinality = 1
Access Table Name = UDBV61.TESTTAB3 ID = 3,12
| #Columns = 2
| Single Record <== ユニーク索引に対する索引スキャン
| Index Scan: Name = UDBV61.TAB3COL1IX ID = 1
| | Index Columns:
| | | 1: COL1 (Ascending)
| | #Key Columns = 1
| | | Start Key: Inclusive Value
| | | | 1: 5
| | | Stop Key: Inclusive Value
| | | | 1: 5
| | Data Prefetch: Eligible
| | Index Prefetch: None
| Lock Intents
| | Table: Intent Exclusive
| | Row : Update
Return Data to Application
| #Columns = 2
End of section
(C)日本IBMシステムズ・エンジニアリング(株) データシステム部
第5章( 41-42 )
DB2 UDB (PC&Unix) デザイン・ガイド
ロック
解説:<参考>ISOLATION=RRに関するロック取得の確認:テスト6
テスト環境
ISOLATION=RR
TESTTAB1およびTESTTAB2表の列COL1に昇順
の索引
副照会による条件節ありの、FOR UPDATEつき
カーソルによる索引スキャン
テスト手順
export DYNEXPLN_OPTIONS='isolation RR'
dynexpln -d sample -q "select * from testtab2
where col1 in (select col1 from testtab1 where
col1 = 'val10' update of col1
ロックの取得
副照会部分:表にIS、行にSロック
FOR UPDATE照会部分:表にIX、行にSロック
考察
副照会部分については、Read-Only扱い
dynexplnの出力
Package Name = UDBV61.DYNEXPLN
Prep Date = 2000/01/21
Prep Time = 09:43:53
Bind Timestamp = 2000-01-21-09.43.53.369425
Isolation Level
= Repeatable Read
Blocking
= Block Unambiguous Cursors
Query Optimization Class = 5
Partition Parallel
= No
Intra-Partition Parallel = No
Function Path
= "SYSIBM", "SYSFUN", "UDBV61"
-------------------- SECTION --------------------Section = 1
SQL Statement:
select * from testtab2
where col1 in (select col1 from testtab1
where col2='val10') for update of col1
(続き))
Estimated Cost
= 51
Estimated Cardinality = 3
Access Table Name = UDBV61.TESTTAB1 ID = 4,9
| #Columns = 2
| Single Record
| Index Scan: Name = UDBV61.COL2IX ID = 1
| | Index Columns:
| | | 1: COL2 (Ascending)
| | #Key Columns = 1
| | | Start Key: Inclusive Value
| | | | 1: 'val10
'
| | | Stop Key: Inclusive Value
| | | | 1: 'val10
'
| | Data Prefetch: Eligible
| | Index Prefetch: None
| Lock Intents
| | Table: Intent Share
| | Row : Share
Nested Loop Join
| Access Table Name = UDBV61.TESTTAB2 ID = 3,11
| | #Columns = 2
| | Index Scan: Name = UDBV61.TAB2COL1IX ID = 1
| | | Index Columns:
| | | | 1: COL1 (Ascending)
| | | #Key Columns = 1
| | | | Start Key: Inclusive Value
| | | | | 1: ?
| | | | Stop Key: Inclusive Value
| | | | | 1: ?
| | | Data Prefetch: Eligible
| | | Index Prefetch: None
| | Lock Intents
| | | Table: Intent Exclusive
| | | Row : Share
Return Data to Application
| #Columns = 2
End of section
(C)日本IBMシステムズ・エンジニアリング(株) データシステム部
ブランク・ページです
第5章( 43-44 )
DB2 UDB (PC&Unix) デザイン・ガイド
ロック
アクセス・パスでのロックのモードの確認
BIND時に作成されるアクセス・
パスの中で、ロックのモードが決定され
る
EXPLAIN出力によるロック・モードの確認方法
静的SQL(
パッケージ):db2explnツール
構文: db2expln -d データベース名 -c 作成者ID -p パッケージ名 -o 出力ファイル名
ヘルプの画面出力: db2expln -h db2explnのみを打鍵して実行した場合には、プロンプトが画面表示され、対話式に実行が可能
動的SQL:
dynexplnツール
構文:dynexpln -d データベース名 -q SQL文 -f 入力ファイル名 -g EXPLAINグラフの表示 -o 出力ファイル名
ヘルプの画面出力:dynexpln -h
dynexplnのみを打鍵して実行した場合には、プロンプトが画面表示され、対話式に実行が可能
DYNEXPLN_OPTIONS環境変数で、PREPオプションを設定することが可能
dynexplnはDYNEXPLN_OPTIONS環境変数で指定されたPREPオプションを使用して、アクセス・パスを決定する
(例)export DYNEXPLN_OPTIONS="QUERYOPT 5 ISOLATION RS"
(C)日本IBMシステムズ・エンジニアリング(株) データシステム部
解説:アクセス・パスでのロックのモードの確認
db2explnコマンドのヘルプ・テキスト出力:db2expln -h
db2expln [-c <creator>] [-d <dbname>] [-e <escape>] [-g] [-i] [-l] [-t|-o <outfile>] [-p <pname>] [-s <sectnbr>] [-u <user> <pw>] [-h|-?]
Input Fields:
-c <creator>
= package qualifier
-d <dbname>
= database name containing packages
-e <escape>
= escape character for LIKE predicate
-g
= show optimizer plan graphs
-h
= help
-i
= show operator ID numbers
-l
= respect package name case
-o <outfile> = name of output file
-p <pname>
= package name
-s <sectnbr>
= section number of package (use zero for all sections)
-t
= terminal output desired
-u <user> <pw>
= user ID and password for connecting to database
-?
= help
dynexplnコマンドのヘルプ・テキスト出力:dynexpln -h
dynexpln [[-d <database>] [-f <input file>] [-g] [-i] [-t|-o <output file>] [-q <SQL statement>] [-u <userid> <password>] [-z <delimiter>]]
Input fields:
-d <database>
= database name to connect to
-f <input file>
= name of file containing SQL statements to describe
-g
= show optimizer plan graphs
-h
= help
-i
= show operator ID numbers
-o <output file>
= name of output file
-q <SQL statement>
= SQL statement(s) to describe
-t
= terminal output desired
-u <userid> <password>
= userid and password for connecting to database
-z <delimiter>
= character used to delimit SQL statements (default is no delimiter)
-?
= help
(C)日本IBMシステムズ・エンジニアリング(株) データシステム部
第5章( 45-46 )
DB2 UDB (PC&Unix) デザイン・ガイド
ロック
アクセス・パスでのロックのモードの確認 -例db2explnツールによる、パッケージのEXPLAIN出力
Package Name = UDBV61.STATICES
Prep Date = 2000/01/07
Prep Time = 15:58:15
Bind Timestamp = 2000-01-07-16.25.43.231864
Isolation Level
= Read Stability
Blocking
= Block Unambiguous Cursors
Query Optimization Class = 5
Partition Parallel
= No
Intra-Partition Parallel = No
Function Path
= "SYSIBM", "SYSFUN", "UDBV61"
------------------- SECTION --------------------------------------Section = 1
SQL Statement:
SELECT MGRNO INTO :H00001
FROM department
WHERE deptno = 'A00'
Estimated Cost
= 25
Estimated Cardinality = 1
Access Table Name = UDBV61.DEPARTMENT ID = 3,7
| #Columns = 2
| Single Record
| Index Scan: Name = UDBV61.DEPTIX ID = 1
| | Index Columns:
| | | 1: DEPTNO (Ascending)
| | #Key Columns = 1
| | | Start Key: Inclusive Value
| | | | 1: 'A00'
| | | Stop Key: Inclusive Value
| | | | 1: 'A00'
| | Data Prefetch: Eligible
| | Index Prefetch: None
| Lock Intents
| | Table: Intent Share
| | Row : Next Key Share
| Return Data to Application
| | #Columns = 1
Return Data Completion
End of section
BIND時に指定されたISOLATION
ロック・モード
(C)日本IBMシステムズ・エンジニアリング(株) データシステム部
ブランク・ページです
第5章( 47-48 )
DB2 UDB (PC&Unix) デザイン・ガイド
ロック
2-5.ロックの互換性
互換性
ロックが取得されているDBオブジェクトに、別アプリケーションからもロックの取得が可能であ
る時、それらのロック・モードは”互換性がある” という
逆に別アプリケーションからロックの取得が不可能であり、既に取得されているロックが解放さ
れるのを待たなければならない場合、それらのロック・モードは”互換性がない” という
ロック待ちの発生を”ロックの競合”という
排他(Exclusive)ロックと共用(Shared)ロックの互換性
概して共用ロック(Sロック)同士は互換性がある
詳細には、ロック・モードにより異なる
取得済みのロック
排他(
X)
取得要求
されたロック 共用(
S)
排他(X)
×
×
共用(S)
×
〇
〇:取得可能 ×:
取得不可能
(C)日本IBMシステムズ・エンジニアリング(株) データシステム部
ブランク・ページです
第5章( 49-50 )
DB2 UDB (PC&Unix) デザイン・ガイド
ロック
ロック・モードによる互換性
互換性一覧
〇:ロック取得可能
×:ロック取得不可能となり、ロック待ちとなる
取得要求されているロック
取得されているロック
モード None
IN
IS
NS
S
IX
SIX
U
NX
X
Z
NW
W
None
IN
〇
〇
〇
〇
〇
〇
〇
〇
〇
〇
〇
〇
〇
〇
〇
〇
〇
〇
〇
〇
〇
×
〇
〇
〇
〇
IS
〇
〇
〇
〇
〇
〇
〇
〇
×
×
×
×
×
NS
〇
〇
〇
〇
〇
×
×
〇
〇
×
×
〇
×
S
〇
〇
〇
〇
〇
×
×
〇
×
×
×
×
×
IX
〇
〇
〇
×
×
〇
×
×
×
×
×
×
×
SIX
〇
〇
〇
×
×
×
×
×
×
×
×
×
×
U
〇
〇
〇
〇
〇
×
×
×
×
×
×
×
×
NX
〇
〇
×
〇
×
×
×
×
×
×
×
×
×
X
〇
〇
×
×
×
×
×
×
×
×
×
×
×
Z
〇
×
×
×
×
×
×
×
×
×
×
×
×
NW
〇
〇
×
〇
×
×
×
×
×
×
×
×
〇
W
〇
〇
×
×
×
×
×
×
×
×
×
〇
×
(C)日本IBMシステムズ・エンジニアリング(株) データシステム部
解説:ロック・モードによる互換性
上記の表の、横軸に書かれているロック・モードで、既にロックが取得されていた場合に、同じデータベース・オブジェクトに対して、
縦軸に書かれているモードで、ロックの取得要求があった場合に、交わる四角の中の印が○であれば、取得要求どおり、ロックは取
得可能です。この場合、2つのロック・モードは互換性がある と言います。交わる四角の中の印が×であれば、取得要求はとおら
ず、既存のロックが外れるまで待たされることになります。
(C)日本IBMシステムズ・エンジニアリング(株) データシステム部
第5章( 51-52 )
DB2 UDB (PC&Unix) デザイン・ガイド
ロック
UロックとFOR UPDATE付きのカーソル
FOR UPDATE付きのカーソル
FETCH後に、WHERE CURRENT OF の指定付きで、現在行のUPDATE/DELETEを行う場合
に、排他制御を行うために使う
OPENカーソル時には行は読み込まれず、FETCH時に1行づつ読み込まれる
FOR UPDATEなしのカーソルの場合、OPENカーソル時に、ある程度の結果行が読み込まれ、クライアントに送られる
FETCH時にFETCH行に、Uロックが取得される (ISOLATION=RRの場合にはSロック)
FETCH後に更新処理があることが予想されるので、行に排他制御をおこなうため
ロックの取られ方
CLP(コマンド行プロセッサー)での検証
db2 DECLARE csr CURSOR FOR select col1 col2 from tab1 for update ; db2 OPEN csr ;
db2 FETCH csr for 1 row ; <=FETCH行にUロック が取得される
db2 UPDATE tab1 set col1=xx where current of csr ; <=UPDATE行にXロック が取得される
db2 COMMIT; <=ロックが解放される
FOR UPDATE付きのカーソルの考慮事項
1行SELECTには使わない
単一行の更新(例:ユニーク索引列を条件にした場合など)には、直接UPDATE文を使用した方が良い
SELECT.......INTO文には、FOR UPDATEは指定できない
FETCH時に1行づつしか読み込まれないので、SELECTのみの処理には使わない
(C)日本IBMシステムズ・エンジニアリング(株) データシステム部
解説:UロックとFOR UPDATE付きのカーソル
FOR UPDATE付きのカーソルは、FETCH後に、WHERE CURRENT OFオプション付きで、現在行の更新(UPDATE/DELETE)を行
う場合に使用します。理由は、FOR UPDATE付きのカーソルでFETCHを行うことにより、行にUロックを取得し、排他制御を行うため
です。Uロックを取得中は、他のアプリケーションがその行をNSロックで読み取ることはできますが、排他的なロック(Xロック、Uロック
など)をかけることはできません。
Uロックにより排他制御されるので、デッドロックを防ぐことができます。
SELECT * from table1
where col1=2 FOR UPDATE;
Uロック
取得
table1
COL1
1
2
3
COL2
A
B
C
COL3
a
b
c
この間は、Uロック取得行に対して、他のアプリケーションからは、
読み取りのみ可能
更新は不可能
UPDATE table1 SET ...
WHERE CURRENT OF カーソル名;
Xロック
取得
(C)日本IBMシステムズ・エンジニアリング(株) データシステム部
第5章( 53-54 )
COL1
1
2
3
COL2
A
B
C
COL3
a
b
c
DB2 UDB (PC&Unix) デザイン・ガイド
ロック
FOR UPDATEあり/なしによる動作の違い
処理例:
(
ISLATION=CSと仮定)
カーソルのOPEN後に、他のアプリケーションが結果セットの行をUPDATEした場合
1. Appl1:DECLARE csr CURSOR FOR select col1,col2 from tab2 where col1 between 200 and 400 FOR UPDATE
;
2. Appl1:OPEN csr;
=>FOR UPDATEなしの場合、結果セットの一部がクライアントに送られる(注1)
=>FOR UPDATEありの場合、FETCH時に1行 がクライアントに送られる
3. Appl2:UPDATE tab2 where col1=300; =>COL1=300の行にXロックを取得
4. Appl1:FETCH csr for 1 row; =>COL1=200の行をFETCHし、Uロックを取得、行が戻される
5. Appl1:FETCH csr for 1 row; =>COL1=300の行をFETCH
上記のステップ5での動作の違い
FOR UPDATEなしのカーソル(ISOLATION=CS)の場合
COL1=300の行が戻される
FOR UPDATEありのカーソル(ISOLATION=CS)の場合
COL1=300の行は、Appl2によりXロックが取得されているため、LOCK WAITとなる
(
注1:BINDのblockingオプションがNOの場合には、結果セットの一部が
クライアントに送られることはありません。)
Uロック COL1
100
200
300
400
COL2
12
22
32
42
(C)日本IBMシステムズ・エンジニアリング(株) データシステム部
解説:FOR UPDATEあり/なしによる動作の違い
FOR UPDATEありの場合には、FETCH時に1行がクライアントに送られます。そのため、次にFETCHする行に排他ロックが取得され
ている場合には、FETCHはWAITします。
FOR UPDATEなしの場合には、FETCH時にある程度の行がクライアントに送られます。これをデータのBLOCKINGと言います。その
ため、行がクライアントに送られた後、実は次にFETCHする行に排他ロックが取得されたとしても、次の行はクライアント側のメモ
リー内にあるため、FETCHすることが可能です。ただし、メモリー内の値は、その時点のデータベース・サーバーにある値とは異なる
可能性があるのです。
ただし、以下の場合には、BLOCKINGは行われません。
・BINDのBLOCKINGオプションでNOを指定した場合
・BINDのBLOCKINGオプションでUNAMBIG(省略時値)を使用した場合で、かつ、カーソルが未確定の場合
カーソルが未確定の場合とは、照会処理のみのカーソルと判別できない場合を指します。
BLOCKINGを行いたい場合で、かつSELECT文にソート処理が入っていない場合には、SELECT文に
FOR FETCH ONLYもしくはFOR READ ONLYを、明示的に指定することをお奨めいたします。
(C)日本IBMシステムズ・エンジニアリング(株) データシステム部
第5章( 55-56 )
DB2 UDB (PC&Unix) デザイン・ガイド
ロック
OPENカーソル時のロック取得 (FOR UPDATEあり)
OPEN時には行は読み込まないので(RRを除く)、ロックは取られない
FETCH時に、1行づつ読み込まれる
FOR UPDATEは、ソート処理を含むSELECTには指定不可
ISOLATION=CS
FETCH時に、照会行にUロックを取得、カーソルが次の行に移ると前の行へのロックは外される
ISOLATION=RS
FETCH時に、照会行に、Uロックを取得し、カーソルが次の行に移ってもUロックを保持
ISOLATION=RR
OPENカーソル時に、走査した行全てと、High KeyにSロックを取得し、FETCH後もSロックを保持
DB2サーバー
RS
RR
走査行+High Key
1万行
1万行
にロック
OPEN csr1;
CS
結果行
照会行
2000行に
ロック
1行にロック
FETCH;
結果行
(C)日本IBMシステムズ・エンジニアリング(株) データシステム部
解説:OPENカーソル時のロック取得 (FOR UPDATEあり)
FOR UPDATEがある場合で、かつ、I
SOLATI
ONがRSまたはCSの場合、カーソルのOPEN時に行を読み込みません。従って、
ロックも取得されません。
I
SOLATI
ONがRRの場合には、OPENカーソル時に、走査行とHI
GH KEYにSロックが取得されます。
OPENカーソルとFETCHの処理
OPENカーソル時には、行は読み込まれません。
FETCH時に、結果行1行がクライアントに送られます。次のFETCHで、次の結果行1行がクライアントに送付されます。
OPEN
クライアント
DB2サーバー
SQLCODE=0
FETCH
1行
FETCH
(C)日本IBMシステムズ・エンジニアリング(株) データシステム部
第5章( 57-58 )
1行
DB2 UDB (PC&Unix) デザイン・ガイド
ロック
<参考>OPENカーソル時のロック取得 (SORTあり)
OPEN時に、結果表が作成される
メモリー(sortheap)内に作成できない場合には、一時表スペースに作成される
ISOLATION=CS
結果表を作成する際に、照会行1行に、読み取るときのみ随時NSロックが取得される
FETCH時には、元表にはロックは取得されず、結果表にアクセスする
ISOLATION=RS
結果行全てに、NSロックを取得
ISOLATION=RR
走査した行全てと、High Keyに、Sロックを取得
DB2サーバー
RS
RR
結果行
走査行+High Key
1万行
1万行
にロック
CS
結果表作成時のみ:照会行
2000行に
ロック
1行にロック
OPEN csr1;
FETCH;
結果表
(C)日本IBMシステムズ・エンジニアリング(株) データシステム部
結果セット
解説:<参考>OPENカーソル時のロック取得 (SORTのみあり)
OPENカーソル時のロック取得の様子は、ISOLATIONにより異なります。ただし、ソート処理がある場合と仮定します。
ISOLATION=CSの場合には、次のFETCH時にクライアントに送る結果セットの先頭行に、NSロックを取得します。
ISOLATION=RSの場合には、結果行全てにNSロックを取得します。
ISOLATION=RRの場合には、検索時に走査した行の全てにSロックを取得します。
OPENカーソルとFETCHの処理
OPENカーソル時に、結果セットがサーバー側で作られます。
FETCH時に、結果セットの最初のブロックがクライアントに送られます。クライアントで、結果セットの行がなくなるまでFETCHが
行なわれると、次のFETCHで、次の結果セットのブロックがクライアントに送付されます。
結果セットを入れるメモリー
リモート・クライアントでは、RQRIOBLK DBM CFG、ローカル・クライアントでは、ASLHEAPSZ DBM CFGがこのメモリーサイズを
決める構成パラメーターです。
クライアント
DB2サーバー
OPEN
SQLCODE=0
FETCH
FETCH
結果セット
結果
セット
結果セットが空になると
次のFETCHで結果セットを要求......
結果
セット
結果表
FETCH
(C)日本IBMシステムズ・エンジニアリング(株) データシステム部
第5章( 59-60 )
DB2 UDB (PC&Unix) デザイン・ガイド
ロック
2-6.ロックの変換(Lock Conversion)
ロックは、処理に必要なモードに変換されていく
1アプリケーションから各DBオブジェクトに取得可能なロックは1つ
(例) 1つのアプリケーションが、1つの行に複数のロックを取得することはできない
ロック変換の例
照会した行を更新する場合
ISOLATION = CSのプログラム
select col1,col2 from table1
where col1 = 100 ;
表にIS
行にNS
..................
.................
update table1 set col2='A01'
where col1 = 100 ;
表にIX
行にX
col1
050
100
150
col2
A20
A00
A00
col3
1
2
NS行ロック => X行ロック
3
IS表ロック=> IX表ロック
変換
変換
(C)日本IBMシステムズ・エンジニアリング(株) データシステム部
解説:ロックの変換
1つのアプリケーションが、DBオブジェクトに取得できるロック・モードは1種類であるため、処理に必要なロック・モードに適宜変換し
てロックを取得します。
(C)日本IBMシステムズ・エンジニアリング(株) データシステム部
第5章( 61-62 )
DB2 UDB (PC&Unix) デザイン・ガイド
ロック
3.ロック・エスカレーション
多数の行ロックを、一つの表ロックへ変更するプロセス
CPU負荷およびメモリー容量削減のためのしくみ
アプリケーションの並行可動性が劣化する可能性あり
他のアプリケーションが取得したロックの解放を待って、エスカレーションする
ロック・
エスカレーションの原因
maxlocks(
1アプリケーションに許されるロックの数)
の値に達した時
locklist(
ロックに使用するメモリー容量の上限)が一杯になった時
ロック・
エスカレーションの回避策
頻繁なCOMMI
T
l
ockl
istDB CFGを増やす
maxl
ocksDB CFGを増やす
ロックの範囲がより狭い分離レベルをを使用
同一表に大量の更新処理がある場合には、あらかじめ表ロックを取得し、処理後速やかに
COMMI
T
WI
TH RELEASEオプション付きのカーソルのCLOSE(RR・RSの時のみ)
(C)日本IBMシステムズ・エンジニアリング(株) データシステム部
解説:ロック・エスカレーション
ロック・エスカレーションの発生と回避
ロックの制御に関する構成パラメーター
LOCKLIST DB CFG:省略時値(ページ) UNIX 100, OS2/NT(リモートクライアントあり) 50
1データベースあたりでロックに使用されるメモリーの上限。
MAXLOCKS DB CFG:省略時値(%) UNIX 10 , OS2/NT 22
LOCKLI
STの中で1アプリケーションが使用可能なメモリーの割合。
この値に達するとロック・エスカレーションが発生する。
ロック・エスカレーション発生の要因
1アプリケーションに許されるロックの数を越えて、ロックを保持しているアプリケーションがある。
トランザクションがmaxlocksを越えた場合、そのトランザクションが最も多くロックを保持している表の行ロックを、表ロックへ
変更します。
ロックに使用されているメモリー容量がLockli
s
t
の値に達した。
ロックリストが一杯になった場合、ロックリストを最も多く使用しているトランザクションが選ばれ、同じ表への行ロックを表
ロックへ変更します。
(複数行への行ロックが、1つの表ロックに入れ替わることになります)
ロック・エスカレーションの回避
l
o
c
k
l
s
tDB CFGを増やす
maxlocksDB CFGを増やす
ロックの範囲がより狭い分離レベルをを使用する。
同一表に大量の更新処理がある場合には、あらかじめ表ロックを取得し、処理後速やかにCOMMI
Tを行う。
頻繁なCOMMI
T
WI
T
H RELEASEオプション付きのカーソルのCLOSE(RR・RSの時のみ)を使用することにより、カーソルのCLOSE時
に全てのReadLockをはずす。
このためRepeatable Readにならない可能性があることに注意。
(C)日本IBMシステムズ・エンジニアリング(株) データシステム部
第5章( 63-64 )
DB2 UDB (PC&Unix) デザイン・ガイド
ロック
db2diag.logのロック・エスカレーション情報
db2diag.logへの出力には、DIAGLEVELの設定が必要
DIAGLEVEL=3 (省略時値)
ロック・エスカレーションの発生情報
DIAGLEVEL=4
ロック・エスカレーションの発生情報 + エスカレーションに起因した動的SQL
静的SQLは記録されない
エスカレーション時のdb2diag.log出力
2000-01-07-14.44.03.232595 Instance:udbv61 Node:000
PID:12754(db2agent (SAMPLE)) Appid:*LOCAL.udbv61.000107053756
data_management sqldEscalateLocks Probe:1 Database:SAMPLE
-- Start Table Lock Escalation.
-- Lock Count, Target : 12, 6
7365 6c65 6374 202a 2066 726f 6d20 6465
select * from de
7061 7274 6d65 6e74 2077 6865 7265 2064
partment where d
6570 746e 6f3d 2744 3231 27
eptno='D21'
DIAGLEVEL=4
2000-01-07-14.44.03.466212 Instance:udbv61 Node:000
PID:12754(db2agent (SAMPLE)) Appid:*LOCAL.udbv61.000107053756
data_management sqldEscalateLocks Probe:2 Database:SAMPLE
-- Lock Count, Target : 12, 6
-- Table (ID) Name
: (3;7) UDBV61 .DEPARTMENT
-- Locks, Request Type : 5, S
-- Result (0 = success): 0
DIAGLEVEL=3
(C)日本IBMシステムズ・エンジニアリング(株) データシステム部
解説:db2diag.logのロック・エスカレーション情報
ロック・エスカレーションについては、UDBのモニター・ツールでもモニタリング可能ですが、db2diag.logで確認することも可能です。
(C)日本IBMシステムズ・エンジニアリング(株) データシステム部
第5章( 65-66 )
DB2 UDB (PC&Unix) デザイン・ガイド
ロック
4.ロック待機(Lock Wait)とロック・タイムアウト
ロック待機(Lock Wait)
互換性のないロックの解放を待つこと
ロック・
タイムアウト
ロック待機状態でいた時間がLOCKTIMEOUTに達した場合、待機していたアプリケーションの
作業単位がロールバックすること
SQLCODE −911 RC 68がアプリケーションに戻される
LOCKTIMEOUT db cfg(省略時値:−1 単位:
秒)
ロック待ちを行う時間を設定する
省略時値では、無制限にロック待ちを行う
1
Appl1
UPDATE
1.Appl1がレコード1をUPDATE
2.Appl2がレコード2をUPDATEする際に、Lock-Wait
レコード1
Xロック
Lock-Wait
Xロック取得要求
レコード2
2
3
LOCKTIMEOUT
Appl2
UPDATE
-911 RC=68
(C)日本IBMシステムズ・エンジニアリング(株) データシステム部
解説:ロック待機(Lock Wait)とロック・タイムアウト
トランザクションがLock-Wai
t
状態になった場合には、次のいづれかの条件になるまで待ちます。
1. Lock−Wa
i
t
の対象となるロックが、コミットまたはロールバックにより解放された
2. LOCKTIMEOUT DB構成パラメーターの値と同じ時間まで待たされた
省略時値では、LOCKTIMEOUTパラメーターには -1 が設定されています。これは、タイムアウトにならないことを意味ます。ロックが
解放されるまで無制限に待ち続けます。
ハングし、動作していないように見えるアプリケーションは、他の長時間トランザクションによるロックを待っている可能性があ
りますので、注意してください。
ロック・スナップショットは、これを判別するのに役立ちます。
(C)日本IBMシステムズ・エンジニアリング(株) データシステム部
第5章( 67-68 )
DB2 UDB (PC&Unix) デザイン・ガイド
ロック
ロック待機のNesting
ロック待機はNestする
既にロック待機が発生しているDBオブジェクトに、互換性のないロック取得の要求があった
場合、その要求以前に存在したロック待機がすべて解消するまで、ロック取得は待たされる
ロックのスナップショット出力では、ロック待機のNestingの順番などはわからない
最初にロックを取得したアプリケーションが保持するロックに対して、その他のロック要求をしているアプリケーションが
ロック待機しているように出力される
1.Appl1がレコード1をUPDATEし、Xロックを取得
2.Appl2がレコード1をUPDATEする際に、Appl1のロックに対してLock-Wait
3.Appl3がレコード1をUPDATEする際に、Appl2のロックに対してLock-Wait
1
Xロック取得要求
Appl1
レコード1
UPDATE
Appl2
Lock-Wait
UPDATE
Xロック
レコード2
2
Lock-Wait
Xロック取得要求
3
Appl
3
UPDATE
(C)日本IBMシステムズ・エンジニアリング(株) データシステム部
解説:ロック待機のNesting
NestしたロックのLock Wait再現シナリオ
1.Appl1: db2 -c- "update department set deptno='A00' where deptname='Dummy'
2.Appl2: db2 -c- "update department set deptno='A00' where deptname='Dummy'
3.Appl3: db2 -c- "update department set deptno='A00' where deptname='Dummy'
4.ロックスナップショットの取得1 (SNAPSHOT1):db2 get snapshot for locks on DB1
5.Appl1: db2 rollback
6.ロックスナップショットの取得2 (SNAPSHOT2):db2 get snapshot for locks on DB1
SNAPSHOT1の出力結果 (抜粋)
Appl1に関する出力部分
Application handle
Application ID
Sequence number
Application name
Authorization ID
Application status
Status change time
Application code page
Locks held
Total wait time (ms)
= 9 <== Appl1
= *LOCAL.udbv61.000106063339
= 0001
= db2bp
= UDBV61
= UOW Waiting
=
= 943
=5
=0
List Of Locks
Lock Object Name = 81930
Object Type
= Row
Tablespace Name = INDTBS
Table Schema
= UDBV61
Table Name
= DEPARTMENT
Mode
= X <= 更新行にX行ロックロックを保持
Status
= Granted
Lock Escalation = NO
(C)日本IBMシステムズ・エンジニアリング(株) データシステム部
第5章( 69-70 )
< 途中省略 >
Lock Object Name = 7
Object Type
= Table
Tablespace Name = INDTBS
Table Schema
= UDBV61
Table Name
= DEPARTMENT
Mode
= IX <= I
X
表ロックを保持
Status
= Granted
Lock Escalation = NO
DB2 UDB (PC&Unix) デザイン・ガイド
ロック
解説:ロック待機のNesting
SNAPSHOT1の出力結果(続き)
Appl2に関する出力部分
Application handle
Application ID
Sequence number
Application name
Authorization ID
Application status
Status change time
Application code page
Locks held
Total wait time (ms)
= 6 <== Appl2
= *LOCAL.udbv61.000106044801
= 0001
= db2bp
= UDBV61
= Lock-wait <== ロック待機中
= 01/06/2000 15:41:28.855775
= 943
=3
= 5306
ロック待ちのサブセクション
=0
ロック保留中エージェント ID
= 9 <== Appl
1に対するロック待機
ロック保留中のアプリケーション ID
= *LOCAL.udbv61.000106063339
ロック・オブジェクト・タイプ
= Row
ロック・モード
= Exclusive Lock (X) <== Appl
1が保持するロック
要求ロック・モード
= Exclusive Lock (X) <== Appl
2が要求するロック
ロック保留中の表スペース名
= INDTBS
ロック保留中の表スキーマ
= UDBV61
ロック保留中の表名
= DEPARTMENT
ロック待機開始タイムスタンプ
= 01/01/1970 09:00:00.000000
自動調整結果のロック
= NO
List Of Locks
Lock Object Name = 7
Object Type
= Table
Tablespace Name = INDTBS
Table Schema
= UDBV61
Table Name
= DEPARTMENT
Mode
= IX
Status
= Granted
Lock Escalation = NO <== I
X
表ロックを保持
(C)日本IBMシステムズ・エンジニアリング(株) データシステム部
解説:ロック待機のNesting
SNAPSHOT1の出力結果(続き)
Appl3に関する出力部分
Application handle
Application ID
Sequence number
Application name
Authorization ID
Application status
Status change time
Application code page
Locks held
Total wait time (ms)
= 10 <== Appl3
= *LOCAL.udbv61.000106063449
= 0001
= db2bp
= UDBV61
= Lock-wait <== ロック待機中
= 01/06/2000 15:41:29.598253
= 943
=3
= 4564
ロック待ちのサブセクション
=0
ロック保留中エージェント ID
= 9 <== Appl1に対するロック待機
ロック保留中のアプリケーション ID
= *LOCAL.udbv61.000106063339
ロック・オブジェクト・タイプ
= Row
ロック・モード
= Exclusive Lock (X) <== Appl
1が保持するロック
要求ロック・モード
= Next Key Share (NS) <== Appl
3が要求するロック
ロック保留中の表スペース名
= INDTBS
ロック保留中の表スキーマ
= UDBV61
ロック保留中の表名
= DEPARTMENT
ロック待機開始タイムスタンプ
= 01/01/1970 09:00:00.000000
自動調整結果のロック
= NO
List Of Locks
Lock Object Name = 7
Object Type
= Table
Tablespace Name = INDTBS
Table Schema
= UDBV61
Table Name
= DEPARTMENT
Mode
=X
I <== I
X
表ロックを保持
Status
= Granted
Lock Escalation = NO
(C)日本IBMシステムズ・エンジニアリング(株) データシステム部
第5章( 71-72 )
DB2 UDB (PC&Unix) デザイン・ガイド
ロック
解説:ロック待機のNesting
SNAPSHOT2の出力結果:Appl3に関する出力部分
Appl1がROLLBACKし、Appl2のロック待機がとけると、Appl3が要求するロックモードがNSからXに変わる
Appl1がROLLBACKし、Appl2のロック待機がとけると、Appl3のロック待機の相手がAppl1からAppl2に変わる
Application handle
Application ID
Sequence number
Application name
Authorization ID
Application status
Status change time
Application code page
Locks held
Total wait time (ms)
= 10 <== Appl3
= *LOCAL.udbv61.000106063449
= 0001
= db2bp
= UDBV61
= Lock-wait
= 01/06/2000 15:41:38.010643
= 943
=3
= 4646
ロック待ちのサブセクション
=0
ロック保留中エージェント ID
= 6 <== Appl2に対するロック待機
ロック保留中のアプリケーション ID
= *LOCAL.udbv61.000106044801
ロック・オブジェクト・タイプ
= Row
ロック・モード
= Exclusive Lock (X) <== Appl
2が保持するロック
要求ロック・モード
= Exclusive Lock (X) <== Appl
3
が要求するロック
ロック保留中の表スペース名
= INDTBS
ロック保留中の表スキーマ
= UDBV61
ロック保留中の表名
= DEPARTMENT
ロック待機開始タイムスタンプ
= 01/01/1970 09:00:00.000000
自動調整結果のロック
= NO
(C)日本IBMシステムズ・エンジニアリング(株) データシステム部
ブランク・ページです
第5章( 73-74 )
DB2 UDB (PC&Unix) デザイン・ガイド
ロック
ロック・タイムアウトの発生と回避
ロック・
タイムアウト発生の要因
ロック・エスカレーションの発生
アプリケーション内での表ロックの取得
BI
ND時の分離レベル(ISOLATION)の範囲が不必要に広い
ロック・
タイムアウト発生の回避
l
ockl
is
tDB CFGを増やす
maxl
ocksDB CFGを増やす
l
ockt
i
meoutDB CFGを増やす
ロックの範囲がより狭い ISOLATION (分離レベル)を使用
同一表への大量更新時には、あらかじめ表ロックを取得し、処理後速やかにCOMMI
T
頻繁なCOMMI
T
WI
TH RELEASEオプション付きのカーソルのCLOSE(
RR・RSの時のみ)を使用
例外処理ルーチンの組み込み
戻り値:SQLCODE=−911、SQLERRD(2)=68
(C)日本IBMシステムズ・エンジニアリング(株) データシステム部
解説:ロック・タイムアウトの発生と回避
Lock WaitによるLock Timeout
ロックタイムアウト監視のしくみ
locktimeout DB CFG:アプリケーションがロック待ちをする時間(秒)。
省略時値 −1(時間制限なくロック待ちを行う)
関連する構成パラメーター
LOCKLIST DB CFG:省略時値(ページ) UNIX 100, OS2/NT(リモートクライアントあり) 50
1データベースあたりでロックに使用されるメモリーの上限。
MAXLOCKS DB CFG:省略時値(%) UNIX 10 , OS2/NT 22
LOCKLI
STの中で1アプリケーションが使用可能なメモリーの割合。
この値に達するとロック・エスカレーションが発生する。
ロックタイムアウト発生の要因
ロック・エスカレーションが発生している。
アプリケーション内で表ロックを取得している。
BI
ND時の分離レベル(ISOLATION)の範囲が不必要に広い。
ロックタイムアウト発生の回避
l
o
c
k
l
s
tDB CFGを増やす
maxlocksDB CFGを増やす
l
o
c
k
t
i
meoutDB CFGを増やす
ロックの範囲がより狭い分離レベルをを使用する。
同一表に大量の更新処理がある場合には、あらかじめ表ロックを取得し、処理後速やかにCOMMI
Tを行う。
頻繁なCOMMI
T
WI
T
H RELEASEオプション付きのカーソルのCLOSE(RR・RSの時のみ)を使用することにより、
カーソルのCLOSE時に全てのReadLockをはずす。
このためRepeatable Readにならない可能性があることに注意。
例外処理ルーチンの組み込み
ロックタイムアウトの発生を検知し、処理の再試行を行うルーチンを用意しておく
ロックタイムアウトの戻り値:SQLCODE=−911、SQLERRD(2)=68
(C)日本IBMシステムズ・エンジニアリング(株) データシステム部
第5章( 75-76 )
DB2 UDB (PC&Unix) デザイン・ガイド
ロック
5.デッドロック
デッドロック
複数のトランザクションが互いにロック待機状態になること
1
Appl1
UPDATE
レコード1
Xロック保持
3
UPDATE
Lock-Wait
Xロック取得要求
Lock-Wait Xロック取得要求
UPDATE
レコード2
4
Xロック保持
2
UPDATE
Appl2
1.トランザクション1がレコード1をUPDATE
2.トランザクション2がレコード2をUPDATE
3.トランザクション1は、トランザクション2のCOMMI
T/ROLLBACKを待つ
4.トランザクション2は、トランザクション1のCOMMI
T/ROLLBACKを待つ
(C)日本IBMシステムズ・エンジニアリング(株) データシステム部
解説:デッドロック
デッドロックは、最初のトランザクションが2番目のトランザクションを待ち、2番目のトランザクションが最初のトランザクションを待つ
ような条件で起こります。2つのトランザクションは、お互いに待ちあい、この状態から抜け出すことはできません。
この例では
1. トランザクション 1 はレコード1を更新します。
2. トランザクション 2 はレコード2を更新します。
3. トランザクション 1はレコード2を更新しようとしますが、そのレコードには排他ロックがかかっているので、待機状態になります。
4. トランザクション 2はレコード1を更新しようとしますが、そのレコードには排他ロックがかかっているので、待機状態になります。
5. デッドロック状態.....
(C)日本IBMシステムズ・エンジニアリング(株) データシステム部
第5章( 77-78 )
DB2 UDB (PC&Unix) デザイン・ガイド
ロック
デッドロックの検知
デッドロック発生をチェックする時間間隔を設定
DLCHKTIME dbm cfg(省略時値:10000 単位:ミリ秒)
デッドロック・ディテクターは指定された時間ごとに実行される
デッドロック・ディテクターはロックリストを検査し、デッドロックの存在を調べる
デッドロック検知時のエラー
デッドロック状態が見つかった場合、デッドロック・ディテクターは関連するトランザクションの中の1つをロールバック
し、SQLCODE −911 RC 2がアプリケーションに戻される
ロールバックされるのは、最後のトランザクションとは限らない
EEE環境でのデッドロック・ディテクター
各パーティションごとに、デッドロック・ディテクター
db2dlock (AIX環境でのプロセス名)
インスタンスに対して、1つのグローバル・ディテクター
db2glock (AIX環境でのプロセス名)
(C)日本IBMシステムズ・エンジニアリング(株) データシステム部
解説:デッドロックの検知
データベースに取得されているロック情報は、すべてロックリストの中に保存されます。
デッドロック・ディテクターは、DB2によって定期的に起動されるプロセス/スレッドです。
DLCHKTI
MEデータベース構成パラメーターで定義された、ミリ秒ごとに起動されます。
デッドロック・ディテクターが稼動すると、ロックリストをスキャンし、デッドロックの状況がないかどうかを調べます。
もし、デッドロックがDB2によって検知されると、関連するトランザクションの中の1つがロールバックされます。.
アプリケーションはSQL 911、reason code 2を受け取ります。
(C)日本IBMシステムズ・エンジニアリング(株) データシステム部
第5章( 79-80 )
DB2 UDB (PC&Unix) デザイン・ガイド
ロック
どのトランザクションがロールバックするか?
デッドロック・ディテクターはロックリストを読み、ロックのチェインを作成
デッドロックが検知された場合
デッドロック・ディテクターは、ロック・チェインへ最後に取りこまれたトランザクションをロールバック
ロールバックされるのは、必ずしも最後に開始したトランザクションではない
ロック・リス
ト
2
Appl1
UPDATE
4
UPDATE
Lock-Wait
レコード1
2
3
4
6
レコード2
レコード10
ApplX
1
Lock-Wait
UPDATE
3
UPDATE
Appl2
1 I
NSER
Appl
xCOMMIT
Appl
1
Appl
2
Appl
1
5
6 Appl
2
空きスペース
に
入る可能性あ
り
T
5 COMMI
T
(C)日本IBMシステムズ・エンジニアリング(株) データシステム部
解説:どのトランザクションがロールバックするか?
ロック・リストを読みながら、デッドロック・ディテクターは、内部処理のためにロック・チェインを作成します。
チェインを作成されると、デッドロック・ディテクターは、デッドロックの存在を検知するために調査をします。
デッドロックがあると、チェインの中の最後のトランザクションが選ばれてロールバックされます。
例:
1.トランザクションXが、レコード10を挿入
2.トランザクション1が、レコード1を更新
3.トランザクション2 が、レコード2を更新
4.トランザクション1が、レコード2を更新しようとするが、レコード2はロックされているのでLOCK-WAI
T
状態になる。
5.トランザクションXが、コミット
6.トランザクション2が、レコード1を更新しようとするが、レコード2はロックされているのでLOCK-WAI
T
状態になる。この時、
上記のトランザクションXがステップ1で使用していたロックリストの場所を、再利用するかもしれません。
この場合、デッドロック・ディテクターは、ロックリストの最後にトランザクション1を見つけて、トランザクション1をロールバックする
可能性があります。
どのトランザクションがロールバックされるかを、予想することはできません。
(C)日本IBMシステムズ・エンジニアリング(株) データシステム部
第5章( 81-82 )
DB2 UDB (PC&Unix) デザイン・ガイド
ロック
デッドロックの発生と回避
デッドロック発生の要因
ロック・エスカレーションの発生
アプリケーション内での表ロックの取得
BI
ND時の分離レベル(ISOLATION)の範囲が不必要に広い
複数アプリケーションが幾つかの同じ行に、異なる順番でロックを取得しようとしている
デッドロック発生の回避
l
ockl
stDB CFGを増やす
maxl
ocksDB CFGを増やす
ロックの範囲がより狭い分離レベルを使用
同一表への大量更新時には、あらかじめ表ロックを取得し、処理後速やかにCOMMI
Tを行う
頻繁なCOMMI
T
WI
TH RELEASEオプション付きのカーソルのCLOSE(
RR・RSの時のみ)を使用
例外処理ルーチンの組み込み
SQLCODE=−911、SQLERRD(
2)
=2
(C)日本IBMシステムズ・エンジニアリング(株) データシステム部
解説:デッドロックの発生と回避
デッドロックの発生と回避
デッドロック監視のしくみ
dl
chkt
i
meDB CFG:デッドロックを監視する時間間隔(ミリ秒)。省略時値 10秒。
関連する構成パラメーター
LOCKLIST DB CFG:省略時値(ページ) UNIX 100, OS2/NT(リモートクライアントあり) 50
1データベースあたりでロックに使用されるメモリーの上限。
MAXLOCKS DB CFG:省略時値(%) UNIX 10 , OS2/NT 22
LOCKLI
STの中で1アプリケーションが使用可能なメモリーの割合。
この値に達するとロック・エスカレーションが発生する。
デッドロック発生の要因
ロック・エスカレーションが発生している。
アプリケーション内で表ロックを取得している。
BI
ND時の分離レベル(ISOLATION)の範囲が不必要に広い。
複数アプリケーションが幾つかの同じ行に、異なる順番でロックを取得しようとしている。
デッドロック発生の回避
l
o
c
k
l
s
tDB CFGを増やす
maxlocksDB CFGを増やす
dl
chkt
i
meDB CFGを増やす
ロックの範囲がより狭い分離レベルをを使用する。
同一表に大量の更新処理がある場合には、あらかじめ表ロックを取得し、処理後速やかにCOMMI
Tを行う。
頻繁なCOMMI
T
WI
T
H RELEASEオプション付きのカーソルのCLOSE(RR・RSの時のみ)を使用することにより、
カーソルのCLOSE時に全てのReadLockをはずす。
このためRepeatable Readにならない可能性があることに注意。
例外処理ルーチンの組み込み
デッドロックの発生を検知し、処理の再試行を行うルーチンを用意しておく
デッドロックの戻り値:SQLCODE=−911、SQLERRD(2)=2
(C)日本IBMシステムズ・エンジニアリング(株) データシステム部
第5章( 83-84 )
DB2 UDB (PC&Unix) デザイン・ガイド
ロック
6.ロックに関するモニタリング
以下に関するモニタリング項目と使用方法
デッドロック検知のためのモニター項目
ロック待機(
Lock-Wait)検知のためのモニター項目
ロック・エスカレーション検知のためのモニター項目
モニター・ツール
スナップショット・モニター
イベント・
モニター
(C)日本IBMシステムズ・エンジニアリング(株) データシステム部
解説:ロックに関するモニタリング
スナップショット・モニター
ある一時点でのデータベース活動状況を収集
カウンター・タイプのモニター項目は、前回のRESET時点から積算された値になる
コマンドおよびコントロール・センターで使用可能
スナップショット・モニターの基本的な使用手順(コマンドの場合)
1.収集するレベルの選択
Database Manager,Database,Application.Tablespace,Table,Lock
UDB V5からのレベル:Bufferpool,FCM for all nodes,Locks for applicaion (Agentid,ApplID)
2.収集する情報グループの選択
モニタースイッチDBM構成パラメーターの更新
UPDATE DBMCFG USI
NG DFT_MON_xxxx ON
モニタースイッチ:DFT_MON_SORT(SORT),DFT_MON_LOCK(LOCK),DFT_MON_TABLE(TABLE),
DFT_MON_BUFPOOL(BUFFERPOOL),DFT_MON_UOW(UOW),DFT_MON_STMT(STATEMENT)
3.カウンターの値をリセット
RESET MONI
T
ORコマンド
4.収集するレベルを指定し、スナップショット・データの収集
GET SNAPSHOTコマンド
(C)日本IBMシステムズ・エンジニアリング(株) データシステム部
第5章( 85-86 )
DB2 UDB (PC&Unix) デザイン・ガイド
ロック
解説:ロックに関するモニタリング
イベント・モニター
イベント・モニター開始時点から停止時点までの、データベース活動イベント・データを収集
コマンドおよびコントロール・センターで使用可能
イベント・モニターの使用手順(コマンドの場合)
1.イベント・モニターの作成
CREATE EVENT MONI
TORステートメント
2.イベント・モニターの活動化
SET EVENT MONI
TOR STATEコマンド
3.イベント・トレースのフォーマット
db2evmonコマンドによるフォーマットと標準出力先への出力
(例)db2evmon -db DBNAME -evm EVENTMON_NAME または
db2evmon -path EVMON_FILE_PATH
(C)日本IBMシステムズ・エンジニアリング(株) データシステム部
解説:ロックに関するモニタリング
イベント一覧
イベント・タイプと収集情報
イベント・タイプ
収集されるタイミング
収集できる情報
Deadlock
デッドロック発生時
関連したアプリケーションとロック
Statements
SQLの終了時
ステートメントの開始/終了時刻、CPU時間、動的SQL
文、SQLCA、FETCU行数など
Statements
(パラレル環境のみ)
サブセクション終了時(パラレル環境のみ)
実行時間、表、表キュー、CPU時間(パラレル環境のみ)
Transactions
Connections
Database
UOW終了時
接続終了時
データベース非活動化もしくは、最後の接続の
切断時
UOWの開始/終了時刻、CPU時間、ロック、ログ
アプリケーション・レベルの全カウンター情報
データベース・レベルの全カウンター情報
Bufferpools
データベース非活動化もしくは、最後の接続の
切断時
バッファープール、プリフェッチャーページクリーナー、
ダイレクトI/O
Tablespaces
データベース非活動化もしくは、最後の接続の
切断時
バッファープール、プリフェッチャーページクリーナー、
ダイレクトI/O
Tables
データベース非活動化もしくは、最後の接続の
切断時
行の読み込み/書き込み
(C)日本IBMシステムズ・エンジニアリング(株) データシステム部
第5章( 87-88 )
DB2 UDB (PC&Unix) デザイン・ガイド
ロック
Lockに関するモニター項目一覧(1)
モニター項目
Snapshotの種類
モニター
スイッチ
基本
Eventの種類
タイプ
Locks Held
データベース
アプリケーション
ロック
データベース
N/A
ゲージ
基本
N/A
ゲージ
データベース
アプリケーション
データベース
アプリケーション
基本
ロック
基本
基本
カウンター
Exclusive Lock Escalations
データベース
アプリケーション
基本
基本
Lock Mode
アプリケーション
ロック
ロック
アプリケーション
ロック
アプリケーション
ロック
ロック
ロック
基本
ロック
ロック
ロック
ロック
データベース
接続
データベース
接続
トランザクション
データベース
接続
トランザクション
デッドロック
N/A
N/A
情報
情報
デッドロック
情報
Total Lock List Memory In
Use
Deadlocks Detected
Lock Escalation
Lock Status
Lock Object type waited
on
Lock Object Name
カウンター
カウンター
情報
注: N/A=モニター不可能
(C)日本IBMシステムズ・エンジニアリング(株) データシステム部
解説:Lockに関するモニター項目一覧(1)
モニター項目のタイプ
カウンター
値が増加していく項目
DATABASE SNAPSHOTの場合、データベースへの接続が存在する間は値が増加し続ける。
RESET MONITORコマンドにより0にリセット可能。 "Deadlock Detected"など。
DATABASE EVENTの場合、 イベント・モニター開始から停止までに起きたイベント数が積算される。
ゲージ
現在の値を示す項目
ウオーターマーク
最大/最小値を示す項目
カウンター・タイプの項目値のリセット
RESET MONITOR [ALL | FOR DATABASE database_name]
値を0にリセット後モニターを開始したい場合には、GET SNAPSHOTコマンドを実行する現行セッションからRESET MONITORコ
マンドを実行すること
他のセッションでのモニリングに影響を与えない
(C)日本IBMシステムズ・エンジニアリング(株) データシステム部
第5章( 89-90 )
DB2 UDB (PC&Unix) デザイン・ガイド
ロック
Lockに関するモニター項目一覧(2)
モニター項目
Snapshotの種類
Number of Lock Timeouts
データベース
アプリケーション
N/A
Maximum Number of Locks
Held
Connections involved in
Deadlock
Lock Waits
モニター
スイッチ
基本
基本
N/A
N/A N/A
データベース
アプリケーション
データベース
アプリケーション
ロック
ロック
ロック
ロック
データベース
ロック
アプリケーション
基本
基本
UOW
アプリケーション
ロック
Agent ID Holding Lock
アプリケーション
ロック
Application ID Holding Lock アプリケーション
ロック
Rolled Back Application
N/A
ロック
ロック
ロック
ロック
ロック
ロック
N/A
Time Waited On Locks
Current Agents Waiting On
Locks
Total Time Unit of Work
Waited on Locks
Lock Wait Start Timestamp
注: N/A=モニター不可能
(C)日本IBMシステムズ・エンジニアリング(株) データシステム部
ブランク・ページです
第5章( 91-92 )
Eventの種類
タイプ
データベース
接続
トランザクション
カウンター
デッドロック
ゲージ
データベース
接続
データベース
接続
トランザクション
N/A
カウンター
N/A
カウンター
デッドロック
N/A
タイムスタン
プ
情報
デッドロック
情報
デッドロック
情報
カウンター
カウンター
ゲージ
DB2 UDB (PC&Unix) デザイン・ガイド
ロック
Deadlock検知のためのモニター項目
Deadlock detected
発生したデッドロックの合計数
Number of applications deadlocked(Connections involved in Deadlock)
デッドロックに関係している接続の数
Rolled Back Application
DAEDLOCK発生時にロールバックされたアプリケーションI
D
モニター項目
Snapshotの種類
モニタースイッチ
Eventの種類
タイプ
Deadlock detected
データベース
アプリケーション
N/A
基本
ロック
N/A
データベース
接続
デッドロック
カウンター
N/A
N/A
デッドロック
情報
Number of applications
deadlocked
(Connections involved in
Deadlock)
Rolled Back Application
注: N/A=モニター不可能
(C)日本IBMシステムズ・エンジニアリング(株) データシステム部
ブランク・ページです
第5章( 93-94 )
ゲージ
DB2 UDB (PC&Unix) デザイン・ガイド
ロック
Deadlockの例:イベント・モニターの出力(1)
Connection Header Event
接続しているアプリケーションに関する情報群
ApplID:各アプリケーションを識別するためのユニークIDで、全てのイベント出力の紐付けに使用する
3) Connection Header Event ...
Appl Handle: 37
Appl Id: *LOCAL.udbinst.980908081001
Appl Seq number: 0001
DRDA AS Correlation Token: *LOCAL.udbinst.980908081001
Program Name : db2bp_s
Authorization Id: UDBINST
Execution Id : udbinst
Codepage Id: 932
Country code: 81
Client Process Id: 27700
Client Database Alias: sample
Client Product Id: SQL05000
Client Platform: AIX
Client Communication Protocol: Local
Client Network Name:
Connect timestamp: 09/08/1998 17:10:01.044707
4) Connection Header Event ...
Appl Handle: 39
Appl Id: *LOCAL.udbinst.980908081302
Appl Seq number: 0001
DRDA AS Correlation Token: *LOCAL.udbinst.980908081302
Program Name : db2bp_s
Authorization Id: UDBINST
Execution Id : udbinst
Codepage Id: 932
Country code: 81
Client Process Id: 34158
Client Database Alias: sample
Client Product Id: SQL05000
Client Platform: AIX
Client Communication Protocol: Local
Client Network Name:
Connect timestamp: 09/08/1998 17:13:02.434329
(C)日本IBMシステムズ・エンジニアリング(株) データシステム部
解説:Deadlockの例:イベント・モニターの出力(1)
Connection Header Eventは、データベースに接続する各アプリケーションの詳細情報をモニターするイベントです。
ApplIDにより、全てのイベント・モニター出力にあるイベントの関連付けを行うことができます。
(C)日本IBMシステムズ・エンジニアリング(株) データシステム部
第5章( 95-96 )
DB2 UDB (PC&Unix) デザイン・ガイド
ロック
Deadlockの例:イベント・モニターの出力(2)
Deadlock Event
デッドロック発生に関する情報群
Deadlock Event:デッドロック発生情報
Deadlocked Connection:デッドロック発生にかかわったアプリケーション情報
8)Deadlock Event ...
Number of applications deadlocked: 2
Deadlock detection time: 09/08/1998 17:20:51.689229
Rolled back Appl Id: : *LOCAL.udbinst.980908081001
Rolled back Appl seq number: : 0001
10) Deadlocked Connection ...
Appl Id: *LOCAL.udbinst.980908081302
Appl Seq number: 0001
Appl Id of connection holding the lock: *LOCAL.udbinst.980908081001
Seq. no. of connection holding the lock:
Lock wait start time: 09/08/1998 17:20:44.248569
9) Deadlocked Connection ...
Deadlock detection time: 09/08/1998 17:20:51.689229
Appl Id: *LOCAL.udbinst.980908081001
Table of lock waited on
: TEST2
Appl Seq number: 0001
Schema of lock waited on : UDBINST
Appl Id of connection holding the lock: *LOCAL.udbinst.980908081302Tablespace of lock waited on : DMSTBS1
Seq. no. of connection holding the lock:
Type of lock: Table
Lock wait start time: 09/08/1998 17:20:45.179299
Mode of lock: S
Deadlock detection time: 09/08/1998 17:20:51.689229
Lock object name: 18
Table of lock waited on
: TEST1
Schema of lock waited on : UDBINST
Tablespace of lock waited on : DMSTBS1
Type of lock: Table
Mode of lock: S
Lock object name: 17
(C)日本IBMシステムズ・エンジニアリング(株) データシステム部
解説:Deadlockの例:イベント・モニターの出力(2)
Deadlock Eventにつづいて、Deadlock Connection. Statement Eventの情報が続きます。
Deadlock Eventには、デッドロック発生に関係したアプリケーションの数、デッドロック発生時刻、ロールバックしたアプリケーションID
が入ります。
Deadlock Connectionには、 デッドロック発生に関係したアプリケーション接続に関する情報が入ります。
Statement Eventには、デッドロック時にロールバックしたSQLステートメントが入ります。
(C)日本IBMシステムズ・エンジニアリング(株) データシステム部
第5章( 97-98 )
DB2 UDB (PC&Unix) デザイン・ガイド
ロック
Deadlockの例:イベント・モニターの出力(3)
Statement Event
Statement Event:デッドロック発生のためにロールバックしたSQL情報
11) Statement Event ...
Appl Handle: 37
Appl Id: *LOCAL.udbinst.980908081001
Appl Seq number: 0001 Type
: Dynamic
Operation: Execute Immediate
Section : 203
Creator : NULLID
Package : SQLC3B0C
Text : delete from test1 Start Time: 09/08/1998 17:20:45.178634
Stop Time: 09/08/1998 17:20:51.690788
Number of Agents created: 1
User CPU: 0.010000 seconds
System CPU: 0.000000 seconds
<途中省略>
Internal rows deleted: 0
Internal rows updated: 0
Internal rows inserted: 0
SQLCA:
sqlcode: -911
sqlstate: 40001
SQL0911N デッドロックまたはタイムアウトのため,現在のトランザクションがロールバックされました。理由コードは "2"。
(C)日本IBMシステムズ・エンジニアリング(株) データシステム部
ブランク・ページです
第5章( 99-100 )
DB2 UDB (PC&Unix) デザイン・ガイド
ロック
Lock Wait検知のためのモニター項目
Lock Waits
ロック待ちが起きた合計回数
Number of Lock Timeouts
ロックタイムアウトの発生回数
Time Waited on Locks
ロック待ちに要した合計時間(ms)
Total Time Unit of Works Waited on locks
UOWがロック待ちに要した時間(ms)
Current Agents waiting on Locks
ロック待ちをしているdb2agentの数
Agent ID Holding Lock
ロック待ちの対象となるロックを保持している、db2agentのアプリケーション・ハンドル。0の場合、対象となるロックは、
Indoubt transactionにより保持されているロックであるという意味。"Applocation ID Holding Lock"を使用すること。
Application ID Holding Lock
ロック待ちの対象となるロックを保持しているdb2agentのアプリケーションI
D。
(C)日本IBMシステムズ・エンジニアリング(株) データシステム部
ブランク・ページです
第5章( 101-102 )
DB2 UDB (PC&Unix) デザイン・ガイド
ロック
Lock Waitの例:スナップショット・モニターの出力(1)
ロック・スナップショット
各アプリケーションごとのロック取得およびロック待機の状況を表示する
(例)1.applhndl-74を実行 ”select * from department”(Isolation=RR)
2.applhndl-72を実行 ”delete * from department”(Isolation=RR)
3. db2 GET SNAPSHOT FOR LOCKS ON sample
Database Lock Snapshot
Database name
= SAMPLE
Database path
= /sampledb/udbinst/NODE0000/SQL00001/
Input database alias
= SAMPLE
Locks held
=4
Applications currently connected
=2
Agents currently waiting on locks
=1
Snapshot timestamp
= 09/14/1998 14:01:58.887416
Application handle
Application ID
Sequence number
Application name
Authorization ID
Application status
Status change time
Application code page
Locks held
Total wait time (ms)
= 74
= *LOCAL.udbinst.980914050119
= 0001
= db2bp_s
= UDBINST
= UOW Waiting
= 09/14/1998 14:01:19.362541
= 932
=2
=0
Object Name Object Type Tablespace Name
Table Schema
Table Name
Mode Status
----------- --------------- -------------------- -------------------- -------------------- ---- ---------5
Table
USERSPACE1
UDBINST
DEPARTMENT
S Granted
0
Internal
S Granted
注: 見やすさのためにV5.2の出力を使用しています
(C)日本IBMシステムズ・エンジニアリング(株) データシステム部
解説:Lock Waitの例:スナップショット・モニターの出力(1)
ロック・スナップショットの出力では、各アプリケーションが取得するロックについての情報(ロックを取得しているオブジェクト名、ロッ
ク・モードなど)を取得することができます。さらに、”Application Status"が"LOCK-WAIT"になっているアプリケーションについて
は、ロック待機に関する情報も表示されます。
(C)日本IBMシステムズ・エンジニアリング(株) データシステム部
第5章( 103-104 )
DB2 UDB (PC&Unix) デザイン・ガイド
ロック
Lock Waitの例:スナップショット・モニターの出力(2)
ロック待機の情報
Application Stateが"Lock-wait"の場合、ロック保留状況の詳細が表示される
デッドロックの場合、"Lock-wait"状態のアプリケーションが複数存在し、互いに互いの持つロックを待つ状況になる
Application handle
Application ID
Sequence number
Application name
Authorization ID
Application status
Status change time
Application code page
Locks held
Total wait time (ms)
= 72
= *LOCAL.udbinst.980914045843
= 0001
= db2bp_s
= UDBINST
= Lock-wait
= 09/14/1998 14:01:55.417613
= 932
=2
= 3469
ロック待ちのサブセクション
=0
ロック保留中エージェント ID
= 74
ロック保留中のアプリケーション ID
= *LOCAL.udbinst.980914050119
ロック・オブジェクト・タイプ
= Tabel
ロック・モード
= Share Lock (S)
ロック保留中の表スペース名
= USERSPACE1
ロック保留中の表スキーマ
= UDBINST
ロック保留中の表名
= DEPARTMENT
ロック待機開始タイムスタンプ
= 09/14/1998 14:01:55.417616
Object Name Object Type Tablespace Name
Table Schema
Table Name
Mode Status
----------- --------------- -------------------- -------------------- -------------------- ---- ---------0
Internal
S Granted
0
Internal
S Granted
注: 見やすさのためにV5.2の出力を使用しています
(C)日本IBMシステムズ・エンジニアリング(株) データシステム部
ブランク・ページです
第5章( 105-106 )
DB2 UDB (PC&Unix) デザイン・ガイド
ロック
Lock Waitの例:スナップショット・モニターの出力(3)
アプリケーション・スナップショット
アプリケーション単位に、デッドロックの発生回数、ロック・エスカレーションの発生回数、
ロック待機の発生回数などを表示する
GET SNAPSHOT FOR APPLICATIONS ON sample
Application Snapshot
Application handle
= 72
Application status
= Lock-wait
Status change time
= 09/14/1998 14:05:50.746989
Application code page
= 932
Application country code
= 81
DUOW correlation token
= *LOCAL.udbinst.980914045843
Application name
= db2bp_s
Application ID
= *LOCAL.udbinst.980914045843
Sequence number
= 0001
Connection request start timestamp
= 09/14/1998 13:58:43.109706
Connect request completion timestamp
= 09/14/1998 13:58:43.112099
< 中略 >
Last reset timestamp
= 09/14/1998 14:05:34.658874
Snapshot timestamp
= 09/14/1998 14:05:59.598448
Locks held by application
=3
Lock waits since connect
=2
Time application waited on locks (ms)
= 8852
Deadlocks detected
=0
Lock escalations
=0
Exclusive lock escalations
=0
Number of Lock Timeouts since connected = 0
Total time UOW waited on locks (ms)
= 8852
(C)日本IBMシステムズ・エンジニアリング(株) データシステム部
ブランク・ページです
第5章( 107-108 )
DB2 UDB (PC&Unix) デザイン・ガイド
ロック
Lock Waitの例:スナップショット・モニターの出力(4)
GET SNAPSHOT FOR DATABASE ON sample
データベース・
スナップショット
データベース単位に、デッドロックの発生回数、ロック・エスカレーションの発生回数、
ロック待機の発生回数などを表示する
Database Snapshot
Database name
= SAMPLE
Database path
= /sampledb/udbinst/NODE0000/SQL00001/
Input database alias
= SAMPLE
Database status
= Active
Catalog node number
=0
Catalog network node name
=
Operating system running at database server= AIX
Location of the database
= ローカル
First database connect timestamp = 09/14/1998 13:55:50.963945
Last reset timestamp
= 09/14/1998 14:05:34.658874
Last backup timestamp
= 09/08/1998 14:23:24.640849
Snapshot timestamp
= 09/14/1998 14:08:34.024562
< 中略 >
Locks held currently
=5
Lock waits
=2
Time database waited on locks (ms)
= 31039
Lock list memory in use (Bytes)
= 1296
Deadlocks detected
=0
Lock escalations
=0
Exclusive lock escalations
=0
Agents currently waiting on locks
=1
Lock Timeouts
=1
(C)日本IBMシステムズ・エンジニアリング(株) データシステム部
ブランク・ページです
第5章( 109-110 )
DB2 UDB (PC&Unix) デザイン・ガイド
ロック
Lock Escatlation検知のためのモニター項目
ロック・
エスカレーション発生の検知
Lock Escalations
Exclusive Lock Escalationsを含むロック・エスカレーションの回数
排他制御のないロック・エスカレーション回数 = Lock Escalations − Exclusive Lock Escalations
Exclusive Lock Escalations
表の排他ロックを取得したロック・エスカレーションの回数
他の更新・照会処理の両方に影響を与えることになるため、要注意。
Maximum Number of Locks Held
ロックが保持された最大値
”1アプリケーションが保持できるロック数の上限”に近似の場合、エスカレーションの原因となった可能性あり。
1アプリケーションが保持できるロック数の上限
= (LOCKLIST(ページ) * 4096 / 32)*(MAXLOCKS(%) / 100)
(C)日本IBMシステムズ・エンジニアリング(株) データシステム部
解説:Lock Escatlation検知のためのモニター項目
ロック・エスカレーションの発生を確認するためには、既出のdb2diag.logで確認する方法か、または、モニターツールを使用して確認
することになります。
(C)日本IBMシステムズ・エンジニアリング(株) データシステム部
第5章( 111-112 )
DB2 UDB (PC&Unix) デザイン・ガイド
ロック
ロックリスト使用状況のモニタリング
1DBあたりのロックに使用されるメモりー(ページ)
量の算出
1アプリケーションあたりの平均ロック数を512個と仮定した場合の、使用ページ数
下限(ページ) = (512 * 32 * MAXAPPLS ) / 4096
上限(ページ) = (512 * 64 * MAXAPPLS ) / 4096
MAXAPPLS DB CFG:1データベースあたりの最大同時稼動アプリケーション数
(省略時値:UNI
X40,NT(リモートクライアントあり)20 )
1ロックあたりに必要なメモリー
64バイト:オブジェクトへの最初のロック 32バイト:ロックのあるオブジェクトへのロック
この算出値をLOCKLIST DB CFGの値と比較し、ロックリストが十分かを検討する。
ロックリスト使用状況の確認
Total Lock List Memory In USE
使用中のロックリスト・メモリーのバイト数
使用されているロックリストの割合(%)
=(Total Lock List Memory In USE(バイト)/ 4096バイト) / LOCKLIST(ページ) *100
この値が大きい場合にはロックリスト・サイズの調整、またはアプリケーションのチューニングが必要となる。
(C)日本IBMシステムズ・エンジニアリング(株) データシステム部
ブランク・ページです
第5章( 113-114 )
DB2 UDB (PC&Unix) デザイン・ガイド
ロック
ロック数のモニタリング
現在保持されているロック数の確認
Locks Held
データベース・レベルのスナップショット
データベース全体で保持されているロック数
1アプリケーション当たりの平均ロック保持数
= ( Lock Held Currently / Applications Connected Currently )
:この値が大きい場合には、アプリケーションでのロック保持に関するチューニングが必要
アプリケーション・レベルのスナップショット
特定アプリケーションが保持するロック数
1アプリケーションが保持できるロック数の上限 = ( LOCKLIST * 4096 / 32 ) * ( MAXLOCKS / 100 )
この値に達するとロック・エスカレーションが発生する。
32:ロックのあるオブジェクトへのロックに必要なメモりー
(C)日本IBMシステムズ・エンジニアリング(株) データシステム部
解説:ロック数のモニタリング
Lock Heldの値は、データベース・スナップショットを取った場合と、アプリケーション・スナップショットを取った場合に、数値が示す内
容が異なるので注意が必要です。
(C)日本IBMシステムズ・エンジニアリング(株) データシステム部
第5章( 115-116 )
DB2 UDB (PC&Unix) デザイン・ガイド
ロック
7.Next Key Locking
Next key locking とは:
索引のある表へのINSERT/DELETEを行った時、該当行の次のHIGH KEYを持つ行に
取得されるロック
ISOLATION=RRで索引のある表に対してSELECTを実行した場合にも、索引キーの次の行にSロックを取得する
該当行の次のHIGH KEYを持つ行が存在しない場合、仮想のHIGHEST KEY行にロックが取得
される
昇順の索引であれば、END OF TABLE行にロックが取得される
降順の索引であれば、BEGIN OF TABLE行にロックが取得される
INSERTの場合
I
NSERT処理中のみロックで、瞬間ロック(instantaneous lock)
COMMI
T/ROLLBACKまでロックを取得しているわけではない
LOCKのスナップショット・モニターで確認不可能
DELETEの場合
COMMI
T/ROLLBACKまでロックを取得している
LOCKのスナップショット・モニターで確認可能
索引に関する限り、UPDATEは、DELETE後にINSERTする処理と同様
Next key lockingは、表に作成された全索引のNext KeyにLOCKを取得
UDB EEEにおいて、Next Key Lockingはノードをまたがらない
(C)日本IBMシステムズ・エンジニアリング(株) データシステム部
解説:Next Key Locking
Next Key lockingは、行が索引からDELETEされた時やI
NSERTされた時に、索引の次の行にも排他ロックがかけられることです。
DB2 UDBでは、このロックは特別な排他ロック(NX,NW ロック)です。 これらは特別なNext Key Share((NS)と互換性があります。NS
は、cursor stability(CS)やread stability(RS)分離レベルを使用して、表スキャンや索引スキャンを行った時に、行をロックするモード
です。
しかし、NW/NXロックは,RR分離レベルで索引スキャンする場合に行をロックする時に使われる、Sロックとは互換性がありませ
ん。
DB2の索引では、UPDATEは、DELETEの後でI
NSERTが起こった場合と同じと考えられます。索引キーの一部である列の値を更
新するSQLステートメントを発行した場合、索引のキー・エントリーに対する更新処理は以下の順で行われます。
更新前のキー・エントリーが索引から削除されます。
その後、新しいキーの値が索引に挿入されます。
(C)日本IBMシステムズ・エンジニアリング(株) データシステム部
第5章( 117-118 )
DB2 UDB (PC&Unix) デザイン・ガイド
ロック
Next Key Lockingの例
前提
表t
a
b
1は2列 (int, char(30))のデータをもつ
create table tab1 (col1 integer, col2 char(30) )
列1に昇順の索引あり
create index col1ix on tab1 ( col1 asc )
表と索引の内容
索引 COL1IX
COL1IX
1
2
3
5
7
20
表 TAB1
COL1
1
2
3
5
7
20
COL2
Joe
Fred
Jim
John
Ann
Albert
(C)日本IBMシステムズ・エンジニアリング(株) データシステム部
ブランク・ページです
第5章( 119-120 )
DB2 UDB (PC&Unix) デザイン・ガイド
ロック
DELETE時のNext Key locking
カタログ表ではない表(索引あり)へのDELETE
(例)Delete from tab1 where column1 = 3
V5.2GA版まで:DELETE行にX、次の行にNX
V5.2+Fixpack7以降、およびV6.1:DELETE行にX、次の行にX
COL1
1
2
3
5
7
20
COL2
Joe
Fred
Jim
John
Ann
Albert
DELETE行,
Xロック取得
NX lock取得(V5.2 Fixpack6まで)
Xロック取得(V5.2+Fixpack7以降およびV6.1)
カタログ表(索引あり)へのDELETE
(例)Drop table tab1
SYSCAT.TABLES表のDELETE行にX、次の行にNX (V6.1まで)
SYSCAT.TABLES表のDELETE行にX、次の行にX (V7.1以降)
(C)日本IBMシステムズ・エンジニアリング(株) データシステム部
解説:DELETE時のNext Key locking
カタログ表以外の表へのDELETE
(V7.1)
db2 -c- "delete from department where deptno='D11'"
db2 get snapshot for locks on sample
Database Lock Snapshot
Database name
= SAMPLE
( 途中省略 )
Locks held
=6
Total wait time (ms)
=0
List Of Locks
Lock Object Name = 81929
Object Type
= Row
Tablespace Name = INDTBS
Table Schema
= UDBV61
Table Name
= DEPARTMENT
Mode
= X <== Next Key Lock
Status
= Granted
Lock Escalation = NO
Lock Object Name = 81928
Object Type
= Row
Tablespace Name = INDTBS
Table Schema
= UDBV61
Table Name
= DEPARTMENT
Mode
=X
Status
= Granted
Lock Escalation = NO
(C)日本IBMシステムズ・エンジニアリング(株) データシステム部
第5章( 121-122 )
DB2 UDB (PC&Unix) デザイン・ガイド
ロック
解説:DELETE時のNext Key locking
カタログ表へのDELETE (V7.1)
db2 -c- "drop table department"
db2 get snapshot for locks on sample
Database Lock Snapshot
Database name
( 途中省略 )
= SAMPLE
List Of Locks
Lock Object Name = 3843
Object Type
= Row
Tablespace Name = SYSCATSPACE
Table Schema
= SYSIBM
Table Name
= SYSTABLES
Mode
= X <==Next
Key Lock
Status
= Granted
Lock Escalation = NO
Lock Object Name = 3842
Object Type
= Row
Tablespace Name = SYSCATSPACE
Table Schema
= SYSIBM
Table Name
= SYSTABLES
Mode
=X
Status
= Granted
Lock Escalation = NO
(C)日本IBMシステムズ・エンジニアリング(株) データシステム部
ブランク・ページです
第5章( 123-124 )
DB2 UDB (PC&Unix) デザイン・ガイド
ロック
DELETE時のNext Key lockingと表スキャン
DELETEによりNext Key Lockingがある状態で、他のアプリケーション
が表スキャンした場合
(例)Appl1 : Delete from tab1 where column1 = 3
Appl2 : Select * from tab1 where column1 >= 2
URの場合、結果セットが戻る
RR,CS,RSの場合、LOCK-WAI
T
Appl2のSELECT
索引
COL1I
X
1
2
3
5
7
20
RR,CS,RS UR
表
COL1
1
2
3
5
7
20
COL2
Joe
Fred
Bill
John
Ann
Albert
X
LOCK-WAIT
NXまたはX
Appl1のDELETE
(C)日本IBMシステムズ・エンジニアリング(株) データシステム部
解説:DELETE時のNext Key lockingと表スキャン
他のアプリケーションが取得したDELETE行へのXロックおよびNext Key Lock(NXまたはXロック)が存在する場合、表スキャンは、
DELETE行に対するXロックでLOCK-WAITすることになります。表スキャンは、最初の行から順にデータを読んでいくしくみだからで
す。
(C)日本IBMシステムズ・エンジニアリング(株) データシステム部
第5章( 125-126 )
DB2 UDB (PC&Unix) デザイン・ガイド
ロック
DELETE時のNext Key lockingと索引スキャン
DELETEによりNext Key Lockingがある状態で、他のアプリケーション
が索引スキャンした場合
(例)Appl1: Delete from tab1 where column1 = 3
Appl2: Select * from tab1 where column1 >= 2
データ読み取りのしくみ
1.索引キー”2”を読む
2.索引キー”2”を持つ表データを読む
3.索引キー”3”はDELETE行であり、スキップされる
4.索引キー”5”を読む
5.索引キー”5”を持つ表データを読むが、NXまたはXロックが取得されている
6.ISOLATIONにより、動作が異なる(次ページ参照)
Appl1のDELETE
Appl2のSELECT
1
3
4
tab1
COL1I
X
1
2
3
5
7
20
2
5
COL1
1
2
3
5
7
20
COL2
Joe
Fred
Bill
John
Ann
Albert
X
NXまたは
X
(C)日本IBMシステムズ・エンジニアリング(株) データシステム部
解説:DELETE時のNext Key lockingと索引スキャン
他のアプリケーションが取得したDELETE行へのXロックおよびNext Key Lock(NXまたはXロック)が存在する場合に、索引スキャ
ンの動作は、バージョンおよびISOLATIONレベルにより異なります、。
(C)日本IBMシステムズ・エンジニアリング(株) データシステム部
第5章( 127-128 )
DB2 UDB (PC&Unix) デザイン・ガイド
ロック
DELETE時のNext Key lockingとロック競合
照会アプリケーションとNext Key Lockの競合
UDBのバージョン、SELECTのアプリケーションのISOLATION(分離レベル)により、照会処理
の動作が異なる
UDBのバージョン
照会処理の
分離レベル
V5+FP6
V5+FP6
V5+FP6
V5+FP7、V6.1以降
V5+FP7、V6.1以降
V5+FP7、V6.1以降
RR
RS,CS
UR
RR
RS,CS
UR
SELECT時 SELECT行に既
のロック
に取得されてい
たNext Key
Lock
S
NX
NS
NX
N/A
NX
S
X
NS
X
N/A
X
結果
LOCK-WAIT
SELECT可能
SELECT可能
LOCK-WAIT
LOCK-WAIT
SELECT可能
(C)日本IBMシステムズ・エンジニアリング(株) データシステム部
解説:DELETE時のNext Key lockingとロック競合
行がDELETEされると、NXロックが索引の次の行に取得されます。索引スキャンを行う他のトランザクションが、DELETEされた行
について確認できるマーカーとなります。CS,RSトランザクションは照会行にNSロックを獲得しますが、これはNXロックと互換性があ
ります。そこで、CS,RSトランザクションはDELETEされた行をよみ飛ばすことができます。もし削除がロールバックされたとしても、
CS,RSアイソレーションは幻像読み取りが許されているので、違反をおかしたことにはなりません。
幻像読み取りは、RRの分離レベルには許されていません。 そこで、索引スキャンは、NXを取得しているトランザクションがコミットさ
れるか、ロールバックされるまで、NXロックが取得された行を待たなければなりません。RR索引スキャンは、NXロックと互換性がな
いSロックを獲得するため、この動作が保証されることになります。
(C)日本IBMシステムズ・エンジニアリング(株) データシステム部
第5章( 129-130 )
DB2 UDB (PC&Unix) デザイン・ガイド
ロック
INSERT時のNext Key locking
カタログ表ではない表
(例)
Insert into tab1 values (8,'Alice')
INSERT行にWロック、次の行にNWロック
NWロックはインスタント・ロックであり、GET SNAPSHOTで確認不可能
DB2_RR_TO_RS=YESの場合
INSERT行にXロック
tab1
COL1
1
2
3
5
7
8
20
COL2
Joe
Fred
Jim
John
Ann
Alice
Albert
INSERT行,
Wロック取得
NWロック取得
カタログ表
(例)Create table tbl1
INSERT行にXロック(V6.1まで)
INSERT行にWロック(V7.1以降)
(C)日本IBMシステムズ・エンジニアリング(株) データシステム部
解説:INSERT時のNext Key locking
索引を持った表に行をI
NSERTする場合、DB2はI
NSERTした行にW,表にI
Xロックを取得し、さらに定義された全ての索引につい
て、INSERT行の次に高いキーを持つ行にNWロックを取得します。
NWロックは、ユニーク索引のある列に重複したキーが発生するのを防ぐのと、RR分離レベルを保証するために行われます。
前の例では、INSERTは以下のロックを獲得します。
I
X表ロック
I
NSERTしたレコードへのXロック
全索引のNext KeyへのNWロック
索引のNext Keyに対応するデータ行へのNW ロック
(この場合はcol
1に対して一つの索引のみが定義されています。そこで、レコード(20,Albert)はNW ロックがかかります。)
結果を変更するような別のレコードをI
NSERTすることはできません。
またNext Key ロックを待っているので、(8,'Annie')をI
NSERTすることもできません。
NWはインスタント・ロックです。このため、作業単位のCOMMI
T
/ROLLBACKを待たずに、I
NSERT処理の終了と共にはずされ
ます。従って、GET SNAPSHOTコマンドで取得状況を確認することはできません。
(C)日本IBMシステムズ・エンジニアリング(株) データシステム部
第5章( 131-132 )
DB2 UDB (PC&Unix) デザイン・ガイド
ロック
解説:INSERT時のNext Key locking
DB2_RR_TO_RS=NO(V7.1)
db2 -c- "INSERT INTO department VALUES ('C11','TEST','000010','A00',NULL)"
db2 get snapshot for locks on sample
(途中省略)
List Of Locks
Lock Object Name = 81933
Object Type
= Row
Tablespace Name = INDTBS
Table Schema
= UDBV61
Table Name
= DEPARTMENT
Mode
=W
<===== I
NSERT行へのロック
Status
= Granted
Lock Escalation = NO
Lock Object Name = 7
Object Type
= Table
Tablespace Name = INDTBS
Table Schema
= UDBV61
Table Name
= DEPARTMENT
Mode
= IX
Status
= Granted
Lock Escalation = NO
(C)日本IBMシステムズ・エンジニアリング(株) データシステム部
解説:INSERT時のNext Key locking
DB2_RR_TO_RS=YES(V7.1)
db2 -c- "INSERT INTO department VALUES ('C11','TEST','000010','A00',NULL)"
db2 get snapshot for locks on sample
(途中省略)
List Of Locks
Lock Object Name = 3372573671
Object Type
= Key Value
Tablespace Name = INDTBS
Table Schema
= UDBV61
Table Name
= DEPARTMENT
Mode
=X
Status
= Granted
Lock Escalation = NO
Lock Object Name = 81933
Object Type
= Row
Tablespace Name = INDTBS
Table Schema
= UDBV61
Table Name
= DEPARTMENT
Mode
=X
<=== I
NSERT行へのロック
Status
= Granted
Lock Escalation = NO
Lock Object Name = 7
Object Type
= Table
Tablespace Name = INDTBS
Table Schema
= UDBV61
Table Name
= DEPARTMENT
Mode
= IX
Status
= Granted
Lock Escalation = NO
(C)日本IBMシステムズ・エンジニアリング(株) データシステム部
第5章( 133-134 )
DB2 UDB (PC&Unix) デザイン・ガイド
ロック
RRでSELECT時のNext Key locking(1)
テスト手順:Select (Isolation=RR) と Insert
1.Appl1(RR):Select * from tab1 where column1 < 10 (索引スキャン)
2.Appl2(CS):Insert into tab1 values (8,'Alice')
Appl1:索引スキャン:Select * from tab1 where column1 < 10
RRでのデータ読み取りのしくみ
1.索引キー”1”を読む
2.索引キー”1”を持つ表データ行を読み、Sロックを取得する
3.10以上のキーが見つかるまで、1と2の繰り返し
4.10以上のキーが見つかったら、Next Key Lock(Sロック)を取得する
t
ab1
索引
1
3
4
COL1I
X
1
2
3
5
7
20
2
COL1
1
2
3
5
7
20
COL2
Joe
Fred
Bill
John
Ann
Albert
S
S
S
S
S
S
(C)日本IBMシステムズ・エンジニアリング(株) データシステム部
解説:RRでSELECT時のNext Key locking(1)
表をSELECTする際に索引スキャンが使われている場合、I
S表ロックが取得され、行にはSロックが取得されます。
”SELECT * FROM TAB1 WHERE COL1 < 10”をRR分離レベルで実行すると、最初に表にI
Sロックを取得し、結果表の全ての行に
S ロックをかけます。索引から結果セットを作成する時に、DB2は条件に合致しない、最初の行まで索引を読みます。この場合は20
です。
そこで、この例では全ての行にSロックがかけられます。条件に合致しない最初の行、つまり20を持つ行には、Next Key Lockと
してのSロックが取得されます。
(C)日本IBMシステムズ・エンジニアリング(株) データシステム部
第5章( 135-136 )
DB2 UDB (PC&Unix) デザイン・ガイド
ロック
RRでSELECT時のNext Key locking (2)
Appl2:Insert into tab1 values (8,'Alice')
RRの保証のしくみ
1.”8、’Al
i
c
e
’
”
をI
NSERTするために、次の索引キーを持つ行にNext Key Lock(NW)を取得しようとする
2.既にSロックが取得されているため、LOCKーWAI
T
する
t
ab1
索引
1
NW
COL1I
X
1
2
3
5
7
20
2
Lock−Wai
t
COL1
1
2
3
5
7
20
COL2
Joe
Fred
Bill
John
Ann
Albert
S
S
S
S
S
S
(C)日本IBMシステムズ・エンジニアリング(株) データシステム部
解説:RRでSELECT時のNext Key locking(2)
新しいレコード(8,'Alice')をI
NSERTするアプリケーションがある場合、RRの照会結果を保証するようなメカニズムが存在しなければ
なりません。
前述のように、
I
NSERT時に、DB2はnext higher keyにNW ロックをかけます。この例では(20,'Alice')です。
この(20,'Alice')の行は、RRでのSELECTの結果としてS ロックが保持されているので、I
NSERTはRRのトランザクションがコミット
するかロールバックするまで、Lock-Wai
t
することになります。
RRの照会では、表に存在する行数によっては、表全体にSロックをかけることがあります。これはRRRの照会では、結果行を作成
するためにアクセスした全ての行にロックをかけるためであり、大きいサイズの表では、表ロックへのロック・エスカレーションが発生
するからです。
Sロックは、他のトランザクションがデータ行をスキャン/読み取りをするのを許します。しかし、行を変更することは許しません。 これ
により、RR分離レベルの目的が達成されることになります。
(C)日本IBMシステムズ・エンジニアリング(株) データシステム部
第5章( 137-138 )
DB2 UDB (PC&Unix) デザイン・ガイド
ロック
RRでSELECT時のNext Key locking(3)
テスト手順:該当行のないSelect (Isolation=RR) + Insert
1.Appl1(RR):Select * from tab1 where col1 in (4, 8 ) (索引スキャン)
2.Appl2(CS):Insert into tab1 values (8,'Alice')
RR実現のしくみ
1.SELECT文の検索条件に合致する索引キーの値が存在しない
2.このため、次のHigh Keyの値に Next
Key Lock(Sロック)を取得する
3.INSERT行の索引キー値の次のHigh ValueにNWロックを取得しようとするが、既にSロックが取得されているため、
LOCK−WAITとなる
tab1
索引
1
COL1I
X
1
2
3
5
7
20
2
COL1
1
2
3
5
7
20
COL2
Joe
Fred
Bill
John
Ann
Albert
S
S
Lock−Wa
i
t
3
NW取得要求
(C)日本IBMシステムズ・エンジニアリング(株) データシステム部
解説:RRでSELECT時のNext Key locking(3)
表をSELECTする際に索引スキャンが使われている場合、I
S表ロックが取得され、行にはSロックが取得されます。
”SELECT * FROM TAB1 WHERE COL1 < 10”をRR分離レベルで実行すると、最初に表にI
Sロックを取得し、結果表の全ての行に
S ロックをかけます。索引から結果セットを作成する時に、DB2は条件に合致しない、最初の行まで索引を読みます。この場合は20
です。
そこで、この例では全ての行にSロックがかけられます。条件に合致しない最初の行、つまり20を持つ行には、Next Key Lockと
してのSロックが取得されます。
(C)日本IBMシステムズ・エンジニアリング(株) データシステム部
第5章( 139-140 )
DB2 UDB (PC&Unix) デザイン・ガイド
ロック
RRでSELECT時のNext Key locking(4)
テスト手順:索引のHighest Keyに対するSelect (Isolation=RR) + Insert
1.Appl1(RR):Select * from tab1 where col1 = 20 (
索引スキャン)
2.Appl2(CS):Insert into tab1 values (22, 'Mel')
RR実現のしくみ
1.SELECT文の検索条件に合致する索引キーの行にSロックを取得する
2.さらの次のHigh Keyの値に Next Key Lock(Sロック)を取得する
この時、”COL1=20"はHighest Keyなので、End of Tableにロックを取得する
3.INSERT行の索引キー値の次のHigh ValueにNWロックを取得しようとするが、既にSロックが取得されているため、
LOCK−WAITとなる
tab1
X
索引 COL1I
1
1
2
3
5
7
20
1 Sロック取得
2
3
Sロック取得
COL1
1
2
3
5
7
20
End of Table
COL2
Joe
Fred
Bill
John
Ann
Albert
Lock−Wa
i
t
NW取得要求
(C)日本IBMシステムズ・エンジニアリング(株) データシステム部
解説:RRでSELECT時のNext Key locking(4)
ロック・スナップショット:索引のHighest Keyに対するSelect (Isolation=RR) + Insert
Appl1のロック取得状況
List Of Locks
Lock Object Name = 0
Object Type
= End of Table
<== End Of Tableへのロック
Tablespace Name = USERSPACE1
Table Schema
= UDBV61
Table Name
= EMPLOYEE3
Mode
=S
Status
= Granted
Lock Escalation = NO
Lock Object Name = 4
Object Type
= Row <== Highest Keyの行へのロック
Tablespace Name = USERSPACE1
Table Schema
= UDBV61
Table Name
= EMPLOYEE3
Mode
=S
Status
= Granted
Lock Escalation = NO
Lock Object Name = 15
Object Type
= Table
Tablespace Name = USERSPACE1
Table Schema
= UDBV61
Table Name
= EMPLOYEE3
Mode
= IS
Status
= Granted
Lock Escalation = NO
Lock Object Name = 0
Object Type
= Internal P Lock
Tablespace Name =
Table Schema
=
Table Name
=
Mode
=S
Status
= Granted
Lock Escalation = NO
Apple2のロック取得とロック待機状況
ロック待ちのサブセクション
=0
ロック保留中エージェント ID
= 24
ロック保留中のアプリケーション ID
= *LOCAL.udbv61.000130014952
ロック・オブジェクト・タイプ
= End of Table <== End Of TableへのLock Wait
ロック・モード
= Share Lock (S)
要求ロック・モード
= Next Key Weak Exclusive (NW)
ロック保留中の表スペース名
= USERSPACE1
ロック保留中の表スキーマ
= UDBV61
ロック保留中の表名
= EMPLOYEE3
ロック待機開始タイムスタンプ
= 02/01/2001 09:00:00.000000
自動調整結果のロック
= NO
List Of Locks
Lock Object Name = 5
Object Type
= Row <==
Tablespace Name = USERSPACE1
Table Schema
= UDBV61
Table Name
= EMPLOYEE3
Mode
=X
Status
= Granted
Lock Escalation = NO
Lock Object Name = 15
Object Type
= Table
Tablespace Name = USERSPACE1
Table Schema
= UDBV61
Table Name
= EMPLOYEE3
Mode
= IX
Status
= Granted
Lock Escalation = NO
(C)日本IBMシステムズ・エンジニアリング(株) データシステム部
第5章( 141-142 )
INSERT行へのロック
DB2 UDB (PC&Unix) デザイン・ガイド
ロック
複数索引とNext Key Locking -INSERT1表に複数索引が存在する場合
全ての索引に対してNext Key Lockが取得される
例1:Insert into tab1 values (4,4)
INSERT行のキーの、次のキーに対してNext Key Lockを取得する
索引
索引
COL1IX
1
3
5
7
COL2IX
1
3
6
8
INSERT
4
4
t
ab1
NW
Next Key
Lock
NW
Next Key
Lock
COL1
1
3
5
7
COL2
6
3
1
8
(C)日本IBMシステムズ・エンジニアリング(株) データシステム部
解説:複数索引とNext Key Locking -INSERT複数索引が存在する表に対してINSERTが行われた場合、全ての索引キーの次のHigh keyを持つ行に対して、Next Key Locking
が行われます。
(C)日本IBMシステムズ・エンジニアリング(株) データシステム部
第5章( 143-144 )
DB2 UDB (PC&Unix) デザイン・ガイド
ロック
複数索引とNext Key Locking -DELETE1表に複数索引が存在する場合
全ての索引に対してNext Key Lockが取得される
例1:Delete from tab1 where col1 = 4 or col2 = 4
DELETE行のキーの、次のキーに対してNext Key Lockを取得する
索引
COL1IX
1
3
4
5
7
索引
COL2IX
1
3
4
6
8
t
ab1
COL1
1
3
Next Key
5
Lock
7
DELETE行 4
Next Key
Lock
COL2
6
3
1
8
4
(C)日本IBMシステムズ・エンジニアリング(株) データシステム部
解説:複数索引とNext Key Locking -DELETE複数索引が存在する表に対してDELETEが行われた場合、全ての索引キーの次のHigh keyを持つ行に対して、Next Key Locking
が行われます。
(C)日本IBMシステムズ・エンジニアリング(株) データシステム部
第5章( 145-146 )
DB2 UDB (PC&Unix) デザイン・ガイド
ロック
Highest keyに対するNext Key Locking
DELETE行/INSERT行のキーがHighest keyであった場合
例1:Delete from tab1 where col1 = 7
DELETEの対象となる表のEOT(End of Table)またはBOT(Begin of Table)にNext Key Lockを取得する
索引
COL1IX
1
3
4
5
7
tab1
Next Key
Lock
COL1
1
3
5
7
4
End of Table
COL2
6
3
1
8
4
(C)日本IBMシステムズ・エンジニアリング(株) データシステム部
解説:Highest keyに対するNext Key Locking
DELETE行/INSERT行のキーがHighest keyであった場合には、End of Table (索引が昇順の場合) または Begin of Table (索引
が降順の場合) という仮想のオブジェクトにNext Key Lockを取得します。
(C)日本IBMシステムズ・エンジニアリング(株) データシステム部
第5章( 147-148 )
DB2 UDB (PC&Unix) デザイン・ガイド
ロック
8.ユティリティーにおける排他制御
Export実行時のロック
Import実行時のロック
Load実行時のロック
Runstats実行時のロック
REORGCHK実行時のロック
Online Backup実行時のロック
(C)日本IBMシステムズ・エンジニアリング(株) データシステム部
ブランク・
ページです
第5章( 149-150 )
DB2 UDB (PC&Unix) デザイン・ガイド
ロック
EXPORT実行時のロック
EXPORTユーテイリティーは、ISOLATION=RRを使用
EXPORTユーティティーのパッケージをバインドし直すことにより、他のISOLATIONに変更可
能
EXPORT Lock-Wait ケース1
1.Appl1が
テーブルにIXロックを取得
レコード5をSELECTし、Uロックを取得
2.Appl2がExportする際に、Appl1のテーブルロックに対してLock-Wait
ISOLATION=RR
1
IXロック
2
Sロック取得要求
レコード1
Appl1
Lock-Wait
SELECT
FOR UPDATE OF
Appl2
EXPORT
レコード5
Uロック
TEST_SOURCE表
ユニーク索引あり
(C)日本IBMシステムズ・エンジニアリング(株) データシステム部
解説:EXPORT実行時のロック
EXPORTがISOLATION=RRであることによる、LOCK WAITの発生
Appl1 : SELECT * FROM TEST_SOURCE WHERE ROW_NUMBER=5 FOR UPDATE OF
TEST_DATA
ISOLATION CSの為、表に対してIX-Lock,行に対してU-Lockを取得しようとする
下記表でロックモードが1つだけ表示されている場合は、表レベルのロックモードで、2つの場合は最初は表レベル、2番目は行レベルです
索引走査のロックモード(述部あり)
分離レベル
読み取り専用
RR
RS
CS
UR
Appl2 : EXPORT ..... SELECT
変更を意図
変更
IS/S
IX/S
IS/NS
IX/U
IS/NS
IX/U
IN
IX/U
* FROM TEST_SOURCE
IX/U
IX/U
IX/U
IX/U
ISOLATION RRの為、表に対してS-Lockを取得しようとする
索引走査のロックモード(述部なし)
分離レベル
RR
RS
CS
UR
読み取り専用
S
IS/NS
IS/NS
IN
変更を意図
IX/U
IX/U
IX/U
IX/U
(C)日本IBMシステムズ・エンジニアリング(株) データシステム部
第5章( 151-152 )
変更
X
IX/X
IX/X
IX/X
DB2 UDB (PC&Unix) デザイン・ガイド
ロック
解説:EXPORT実行時のロック
Lock Wait再現シナリオ
1.Appl1: db2 -c- "select * from test_source where row_number=5 for update of test_data' (ISOLATION RR)
2.Appl2: db2 -c- "export to test.ixf of ixf select * from test_source'
ロックスナップショットの取得1 (SNAPSHOT1):db2 get snapshot for locks on V6DB
SNAPSHOT1の出力結果 (抜粋)
Appl1に関する出力部分
Application handle
<==Appl1
Application ID
Sequence number
Application name
Authorization ID
Application status
Status change time
Application code page
Locks held
Total wait time (ms)
=2
= *LOCAL.db2v6.000124232048
= 0001
= db2bp
= DB2V6
= UOW Waiting
= 収集されませんでした
= 932
=3
=0
Lock Object Name = 4
Object Type
= Table
Tablespace Name = AZSP1
Table Schema
= DB2V6
Table Name
= TEST_SOURCE
Mode
= IX
<= IX表ロックを保持
Status
= Granted
Lock Escalation = NO
List Of Locks
Lock Object Name = 32776
Object Type
= Row
Tablespace Name = AZSP1
Table Schema
= DB2V6
Table Name
= TEST_SOURCE
Mode
=U
<=更新意図の行にUロックを保持
Status
= Granted
Lock Escalation = NO
(C)日本IBMシステムズ・エンジニアリング(株) データシステム部
解説:EXPORT実行時のロック
SNAPSHOT1の出力結果(続き)
Appl2に関する出力部分
Application handle
Application ID
Sequence number
Application name
Authorization ID
Application status
Status change time
Application code page
Locks held
Total wait time (ms)
機
ク
ロック待ちのサブセクション
ロック保留中エージェント ID
=3
<=Appl2
= *LOCAL.db2v6.000124232144
= 0001
= db2bp
= DB2V6
= Lock-wait
<=ロック待機中
= 収集されませんでした
= 932
=2
= 9889
=0
=2
<=Appl1に対するロツク待
ロック保留中のアプリケーション ID
= *LOCAL.db2v6.000124232048
ロック・オブジェクト・タイプ
= Tabel
ロック・モード
= Intention Exclusive Lock (IX) <=Appl1が保持するロック
要求ロック・
モード
= Share Lock (S)
<=Appl2が要求するロッ
ロック保留中の表スペース名
ロック保留中の表スキーマ
ロック保留中の表名
ロック待機開始タイムスタンプ
自動調整結果のロック
= AZSP1
= DB2V6
= TEST_SOURCE
= 01/01/1970 09:00:00.000000
= NO
(C)日本IBMシステムズ・エンジニアリング(株) データシステム部
第5章( 153-154 )
DB2 UDB (PC&Unix) デザイン・ガイド
ロック
解説:EXPORT実行時のロック
EXPORTユーティリティーのISOLATION Levelの確認
Statement Eventの取得
15) Statement Event ...
Appl Handle: 3
Appl Id: *LOCAL.db2v6.000124232144
Appl Seq number: 0001
Record is the result of a flush: FALSE
------------------------------------------Type
: Dynamic
Operation: Describe
Section : 1
Creator : NULLID
Package : SQLUBC06 <------ EXPORTが使用しているパッケージ名
Cursor : CURSOR1
Text
: select * from test_source
------------------------------------------システムカタログ照会
SELECT PKGNAME, ISOLATION , PKGSCHEMA FROM SYSCAT.PACKAGES
WHERE PKGNAME='SQLUBC06' AND PKGSCHEMA='NULLID'
PKGNAME ISOLATION PKGSCHEMA
-------- --------- ----------------------------------------------------------SQLUBC06 RR
NULLID
1 レコードが選択されました。
RRを使用することが確認できる
(C)日本IBMシステムズ・エンジニアリング(株) データシステム部
ブランク・
ページです
第5章( 155-156 )
DB2 UDB (PC&Unix) デザイン・ガイド
ロック
EXPORT Lock-Wait回避ケース
EXPORTユーテイリティーのISOLATIONをCSに変更する
Appl2はロック待ちにならず、EXPORTが終了する
1.Appl1が
テーブルにIXロックを取得
レコード5をSELECTし、Uロックを取得
2.Appl2がExportする際に、Appl1のテーブルロックに対してLock-Wait
ISOLATION=CS
1
IXロック
Appl1
2
ISロック
レコード1
SELECT
FOR UPDATE OF
Appl2
EXPORT
Lock-Wait
なし
Sロック
レコード5
Uロック
TEST_SOURCE表
ユニーク索引あり
(C)日本IBMシステムズ・エンジニアリング(株) データシステム部
解説:EXPORT Lock-Wait回避ケース
Appl1 : SELECT * FROM TEST_SOURCE WHERE ROW_NUMBER=5 for Update of TEST_DATA
ISOLATION CSの為、表に対してIX-Lock,行に対してU-Lockを取得しようとする
下記表でロックモードが1つだけ表示されている場合は、表レベルのロックモードで、2つの場合は最初は表レベル、2番目は行レベルです
索引走査のロックモード(述部あり)
分離レベル
RR
RS
CS
UR
読み取り専用
IS/S
IS/NS
IS/NS
IN
変更を意図
変更
IX/S
IX/U
IX/U
IX/U
IX/U
IX/U
IX/U
IX/U
Appl2 : EXPORT ..... SELECT * FROM TEST_SOURCE
ISOLATION CSの為、表に対してISS-Lock,行にNS-LOCKを取得しようとする
索引走査のロックモード(述部なし)
分離レベル
RR
RS
CS
UR
読み取り専用
S
IS/NS
IS/NS
IN
変更を意図
IX/U
IX/U
IX/U
IX/U
変更
X
IX/X
IX/X
IX/X
表に対するIX/ISおよび行に対するU/NSは互換性があるのでEXPORTはLock-Waitにはなら
ない
(C)日本IBMシステムズ・エンジニアリング(株) データシステム部
第5章( 157-158 )
DB2 UDB (PC&Unix) デザイン・ガイド
ロック
解説:EXPORT Lock-Wait回避ケース
EXPORTユーティリティーをBINDする方法
1.データベースへの接続
db2 connect
データベース接続情報
データベース・サーバー
= DB2/6000 6.1.0
SQL 権限 ID = DB2V6
ローカル・データベース別名 = V6DB
2.BI
NDコマンドでI
SOLATI
ONをCSで指定
db2uexpm.bnd はEXPORTユーティリティーのバインド・ファイル名
db2 bind $HOME/sqllib/bnd/db2uexpm.bnd isolation cs
LINE MESSAGES FOR db2uexpm.bnd
------ -----------------------------------------------SQL0061W バインド・プログラムが処理中です。
SQL0091N バインドが、エラー "0" と 警告 "0" で終了しました。
3.ISOLATIONの確認するために、システムカタログを照会する
db2 "SELECT PKGNAME, ISOLATION , PKGSCHEMA FROM SYSCAT.PACKAGES
WHERE PKGNAME='SQLUBC06' AND PKGSCHEMA='NULLID' "
PKGNAME ISOLATION PKGSCHEMA
-------- --------- --------------------------------SQLUBC06 CS
NULLID
CSを使用することが確認できる
(C)日本IBMシステムズ・エンジニアリング(株) データシステム部
ブランク・
ページです
第5章( 159-160 )
DB2 UDB (PC&Unix) デザイン・ガイド
ロック
IMPORT実行時のロック
排他モードの表ロックを取得
パッケージの中で、LOCK TABLE xx IN EXCLUSIVE MODEステートメントが発行されている
ISOLATION=UR(INロック)以外は、IMPORT先の表にアクセス不可能
1.Appl1が
テーブルにISロックを取得
レコード3をSELECTし、NSロックを取得
2.Appl2がIMPORTする際に、Appl1のテーブルロックに対してLock-Wait
ISOLATION=RS
ISロック
ISOLATION=RR
1
2
レコード1
Appl1
Xロック取得要求
Lock-Wait
Appl2
IMPORT
レコード3
SELECT * FROM
TEST_SOURCE
WHERE
ROW_NUMBER=3
NSロック
レコード5
TEST_SOURCE表
ユニーク索引あり
(C)日本IBMシステムズ・エンジニアリング(株) データシステム部
解説:IMPORT実行時のロック
Lock Wait再現シナリオ
1.Appl1: db2 -c- "select * from test_source where row_number=3' (ISOLATION RS)
2.Appl2: db2 -c- "import from test.ixf of ixf insert into test_source'
ロックスナップショットの取得1 (SNAPSHOT1):db2 get snapshot for locks on V6DB
SNAPSHOT1の出力結果 (抜粋)
Appl1に関する出力部分
Application handle
Application ID
Sequence number
Application name
Authorization ID
Application status
Status change time
Application code page
Locks held
Total wait time (ms)
=2
<= Appl1
= *LOCAL.db2v6.000125034143
= 0001
= db2bp
= DB2V6
= UOW Waiting
= 収集されませんでした
= 932
=3
=0
List Of Locks
Lock Object Name = 32774
Object Type
= Row
Tablespace Name = AZSP1
Table Schema
= DB2V6
Table Name
= TEST_SOURCE
Mode
= NS
Status
= Granted
Lock Escalation = NO
<= 参照した行にNS-Lockを保持
(C)日本IBMシステムズ・エンジニアリング(株) データシステム部
第5章( 161-162 )
Lock Object Name = 4
Object Type
= Table
Tablespace Name = AZSP1
Table Schema
= DB2V6
Table Name
= TEST_SOURCE
Mode
= IS
<==IS表ロックを保持
Status
= Granted
Lock Escalation = NO
DB2 UDB (PC&Unix) デザイン・ガイド
ロック
解説:IMPORT実行時のロック
SNAPSHOT1の出力結果(続き)
Appl2に関する出力部分
Application handle
Application ID
Sequence number
Application name
Authorization ID
Application status
Status change time
Application code page
Locks held
Total wait time (ms)
<続き>
=3
<=Appl2
= *LOCAL.db2v6.000125034241
= 0001
= db2bp
= DB2V6
= Lock-wait
<=ロック待機中
= 収集されませんでした
= 932
=8
= 4942
ロック待ちのサブセクション
=0
ロック保留中エージェント ID
=2
<= Appl1に対するロック待機
ロック保留中のアプリケーション ID
= *LOCAL.db2v6.000125034143
ロック・オブジェクト・タイプ
= Table
ロック・モード
= Intention Share Lock (IS)
<=Appl1が保持
要求ロック・
モード
= Exclusive Lock (X)
<=Appl2が要求
ロック保留中の表スペース名
= AZSP1
ロック保留中の表スキーマ
= DB2V6
ロック保留中の表名
= TEST_SOURCE
ロック待機開始タイムスタンプ
= 01/01/1970 09:00:00.000000
自動調整結果のロック
= NO
List Of Locks
Lock Object Name = 3850
Object Type
= Row
Tablespace Name
= SYSCATSPACE
Table Schema
= SYSIBM
Table Name
= SYSTABLES
Mode
= NS
Status
= Granted
Lock Escalation
= NO
Lock Object Name = 2
Object Type
= Table
Tablespace Name
= SYSCATSPACE
Table Schema
= SYSIBM
Table Name
= SYSTABLES
Mode
= IS
Status
= Granted
Lock Escalation
= NO
(C)日本IBMシステムズ・エンジニアリング(株) データシステム部
解説:IMPORT実行時のロック
IMPORTユーティリティーのLock statementの確認
Statement Eventの取得
Appl Handle: 2
Appl Id: *LOCAL.db2v6.000125033526
Appl Seq number: 0001
Record is the result of a flush: FALSE
------------------------------------------Type
: Dynamic
Operation: Execute Immediate
Section : 2
Creator : NULLID
Package : SQLUKC06
Cursor :
Text
: LOCK TABLE test_source IN EXCLUSIVE MODE <== 排他ロックを表に取得している
------------------------------------------システムカタログ照会
SELECT PKGNAME, ISOLATION , PKGSCHEMA FROM SYSCAT.PACKAGES
WHERE PKGNAME='SQLUKC06' AND PKGSCHEMA='NULLID'
PKGNAME ISOLATION PKGSCHEMA
-------- --------- ----------------------------------------------------------SQLUKC06 RR
NULLID
RRを使用しているが確認できる
(C)日本IBMシステムズ・エンジニアリング(株) データシステム部
第5章( 163-164 )
DB2 UDB (PC&Unix) デザイン・ガイド
ロック
LOAD実行時のロック
排他モードのQUIESCEをかけている
表スペースと、表スペース内の表すべてに対してZ-LOCKを取得する
LOAD先の表と同じ表スペースにある表が参照されLOCKを保持している場合、LOADはLock-Waitになる
Zロック
TABLE SPACE
Zロック
TABLE
ROW
INDEX
(C)日本IBMシステムズ・エンジニアリング(株) データシステム部
ブランク・
ページです
第5章( 165-166 )
DB2 UDB (PC&Unix) デザイン・ガイド
ロック
LOADのLock-Waitケース1:LOAD実行時
LOAD先と同じ表スペースにある表にロックがあると、LOADはロック待ちに
なってしまう
1.Appl1がTEST_SOURCE2表をISOLATION RSでSELECT
2.Appl2が同じ表スペースにあるTEST_SOURCEへLOAD INSERT =>Lock-Wait
3.Appl3がTEST_SOURCEをダーティーREAD => Lock-Wait
ISOLATION=RS
表ISロック
表スペース Zロック取得
1
2
行NSロック
Appl1
SELECT
TEST_SOURCE2表
Appl2
表Zロック取得要求
LOAD .... INSERT INTO TEST_SOURCE
Lock-Wait
表 Zロック取得
TEST_SOURCE表
表スペース: AZSP1
表INロック取得要
求 Lock-Wait
3
ISOLATION=UR
Appl3
SELECT
(C)日本IBMシステムズ・エンジニアリング(株) データシステム部
解説:LOADのLock-Waitケース1:LOAD実行時
Lock Wait再現シナリオ
1.Appl1: db2 -c- "select * from test_source2 where row_number=1' (ISOLATION RS)
2.Appl2: db2 -c- "Load from test.ixf of ixf insert into test_source'
3.Appl3. db2 -c- "select * from test_source" (ISOLATION UR)
ロックスナップショットの取得1 (SNAPSHOT1):db2 get snapshot for locks on V6DB
SNAPSHOT1の出力結果 (抜粋)
Appl1に関する出力部分
Application handle
Application ID
Sequence number
Application name
Authorization ID
Application status
Status change time
Application code page
Locks held
Total wait time (ms)
=2
<=Appl1
= *LOCAL.db2v6.000125043631
= 0001
= db2bp
= DB2V6
= UOW Waiting
= 収集されませんでした
= 932
=3
=0
Lock Object Name = 5
Object Type
= Table
Tablespace Name = AZSP1
Table Schema
= DB2V6
Table Name
= TEST_SOURCE2
Mode
= IS
<=表にIS-Lock保持
Status
= Granted
Lock Escalation = NO
List Of Locks
Lock Object Name = 65540
Object Type
= Row
Tablespace Name = AZSP1
Table Schema
= DB2V6
Table Name
= TEST_SOURCE2
Mode
= NS
<=SELECT行に対しNS-Lock保
持
Status
= Granted
Lock Escalation = NO
(C)日本IBMシステムズ・エンジニアリング(株) データシステム部
第5章( 167-168 )
DB2 UDB (PC&Unix) デザイン・ガイド
ロック
解説:LOADのLock-Waitケース1:LOAD実行時
SNAPSHOT1の出力結果(続き)
Appl2に関する出力部分
Application handle
Application ID
Sequence number
Application name
Authorization ID
Application status
Status change time
Application code page
Locks held
Total wait time (ms)
=3
<=Appl2
= *LOCAL.db2v6.000125043708
= 0001
= db2bp
= DB2V6
= Lock-wait
<=ロック待機中
= 収集されませんでした
= 932
=5
= 154875
ロック待ちのサブセクション
=0
ロック保留中エージェント ID
=2
<= Appl1に対するロック待機
ロック保留中のアプリケーション ID
= *LOCAL.db2v6.000125043631
ロック・オブジェクト・タイプ
= Table
<= 表で競合発生
ロック・モード
= Intention Share Lock (IS)
<= Appl1が保持
要求ロック・
モード
= Super Exclusive Lock (Z) <= Appl2が要求
ロック保留中の表スペース名
= AZSP1
ロック保留中の表スキーマ
= DB2V6
ロック保留中の表名
= TEST_SOURCE2
ロック待機開始タイムスタンプ
= 01/01/1970 09:00:00.000000
自動調整結果のロック
= NO
List Of Locks
Lock Object Name = 4
Object Type
= Table
Tablespace Name = AZSP1
Table Schema
=
Table Name
=
Mode
=Z
<= Z-Lockを保持
Status
= Granted
Lock Escalation = NO
Lock Object Name = 3
Object Type
= Tablespace
Tablespace Name = AZSP1
Table Schema
=
Table Name
=
Mode
=Z
<= Z-Lockを保持
Status
= Granted
Lock Escalation = NO
(C)日本IBMシステムズ・エンジニアリング(株) データシステム部
解説:LOADのLock-Waitケース1:LOAD実行時
SNAPSHOT1の出力結果(続き)
Appl 3に関する出力部分
Application handle
Application ID
Sequence number
Application name
Authorization ID
Application status
Status change time
Application code page
Locks held
Total wait time (ms)
=4
<= Appl 3
= *LOCAL.db2v6.000125043931
= 0001
= db2bp
= DB2V6
= Lock-wait
<= ロック待機
= 収集されませんでした
= 932
=6
= 12148
ロック待ちのサブセクション
=0
ロック保留中エージェント ID
= 3 <=Appl 2に対するロック待ち
ロック保留中のアプリケーション ID
= *LOCAL.db2v6.000125043708
ロック・オブジェクト・タイプ
= Table
ロック・モード
= Super Exclusive Lock (Z) <= Appl2が保持
要求ロック・モード
= Intent None Lock (IN)
<= Appl3が要求
ロック保留中の表スペース名
= AZSP1
ロック保留中の表スキーマ
=
ロック保留中の表名
=
ロック待機開始タイムスタンプ
= 01/01/1970 09:00:00.000000
自動調整結果のロック
= NO
(C)日本IBMシステムズ・エンジニアリング(株) データシステム部
第5章( 169-170 )
List Of Locks
Lock Object Name = 3850
Object Type
= Row
Tablespace Name = SYSCATSPACE
Table Schema
= SYSIBM
Table Name
= SYSTABLES
Mode
= NS
Status
= Granted
Lock Escalation = NO
Lock Object Name = 2
Object Type
= Table
Tablespace Name = SYSCATSPACE
Table Schema
= SYSIBM
Table Name
= SYSTABLES
Mode
= IS
Status
= Granted
Lock Escalation = NO
DB2 UDB (PC&Unix) デザイン・ガイド
ロック
LOADのLock-Waitケース2:LOAD異常終了時
LOAD異常終了時のファントムQuiesceの解消方法
ファントムQUIESCE(Phantom Quiesce)とは、所有者のいないQUIESCEのこと
QUIESCE RESETを実行することにより解消
(例)
1.Appl1がLOAD 実行中に異常終了("Phantom Quiesce"の発生)
2.Appl2が同じ表スペースにあるTEST_SOURCEをSELECTすると、SQLCODE -290となる (Lock Waitではない)
3.Appl3がQUIESCE RESETを発行 ("Phantom Quiesce"の解消)
表Zロック
表Zロック取得
SQL0290N Table space access is not allowed.
1
2
Appl2
Appl1
LOAD .... INSERT
INTO TEST_SOURCE
SELECT
TEST_SOURCE表
QUIESCE
RESET
表スペース
Zロック取得
3
Appl3
表スペース: AZSP1
(C)日本IBMシステムズ・エンジニアリング(株) データシステム部
解説:LOADのLock-Waitケース2:LOAD異常終了時
-290再現シナリオ
1.Appl1: db2 -c- "Load from test.ixf of ixf insert into test_source copy yes to /dbland1 HOLD Quiesce"
2.Appl2: db2 -c- "select * from test_source"
SQLCODE -290
ロックスナップショットの取得1 (SNAPSHOT1):db2 get snapshot for locks on V6DB
Lock競合は発生していない
Quiesce コマンドが発行されるとObjectに対するZ-Lockが取得され、すべて取得されるとTablespaceの状況を変えLockを
解放する
List Tablespaces show detaol出力結果 AZSP1に関する出力部分
表スペース ID
名前
タイプ
内容
状況
詳しい説明:
静止: EXCLUSIVE
合計ページ数
使用可能ページ数
使用したページ
空きページ
最高水準点 (ページ) ページ・
サイズ (バイト)
エクステント・
サイズ (バイト)
プリフェッチ・サイズ (バイト)
コンテナー数
最小回復時間 静止状態の数
静止状態 1:
表スペース ID
オブジェクト ID
=3
= AZSP1
= データベース管理スペース
= 任意のデータ
= 0x0004
<=== Quiesce Exclusive
= 1000
= 992
=0
=0
=0
= 4096
= 32
= 32
=1
= 2000-01-25-04.33.05.000000
=1
=3
=4
(C)日本IBMシステムズ・エンジニアリング(株) データシステム部
第5章( 171-172 )
DB2 UDB (PC&Unix) デザイン・ガイド
ロック
解説:LOADのLock-Waitケース2:LOAD異常終了時
3.Appl3: db2 "quiesce tablespace for table test_source reset"
"Pantom Quiesceの解消"
4.Appl2: db2 -c- "select * from test_source"
SQLCODE 0
List Tablespaces show detaol出力結果 AZSP1に関する出力部分
表スペース ID
名前
タイプ
内容
状況
詳しい説明:
静止: EXCLUSIVE
合計ページ数
使用可能ページ数
使用したページ
空きページ
最高水準点 (ページ) ページ・サイズ (バイト)
エクステント・サイズ (バイト)
プリフェッチ・サイズ (バイト)
コンテナー数
最小回復時間 静止状態の数
静止状態 1:
表スペース ID
オブジェクト ID
=3
= AZSP1
= データベース管理スペース
= 任意のデータ
= 0x0000
<=== Normal
= 1000
= 992
=0
=0
=0
= 4096
= 32
= 32
=1
= 2000-01-25-04.33.05.000000
=1
=3
=4
(C)日本IBMシステムズ・エンジニアリング(株) データシステム部
ブランク・
ページです
第5章( 173-174 )
DB2 UDB (PC&Unix) デザイン・ガイド
ロック
Runstats実行時のロック
RUNSTATS の構文
Schema.Table-Name
ALIAS
RUNSTATS ON TABLE
WITH DISTRIBUTION
AND
DETAILED
AND
FOR
SHRLEVEL
INDEXES ALL
index-name
INDEXES ALL
index-name
DETAILED
CHANGE
REFERENCE
2つのSHRLEVELオプション
CHANGE(省略時)の場合:
Runstats実行中でも該当表を変更可能
1. SYSTABLESに対してIS/NS-Lock
2. 該当表に対してIN-Lock(UR)でアクセス
3. カタログ更新(IX,X-Lock)
REFERENCEの場合:Runstats実行中,該当表はRead-Only
1. SYSTABLESに対してIS/NS-Lock
2. 該当表に対してS-Lock(RR)でアクセス
3. カタログ更新(IX,X-Lock)
(C)日本IBMシステムズ・エンジニアリング(株) データシステム部
解説:Runstats実行時のロック
RUNSTATS SHRLEVEL CHANGEの場合のロック取得
SHARELEVEL CHANGEは該当表をダーティーREADしているのでカタログの統計情報が実際と異なる場合もありえる
TEST_SOURCE表
1
Appl1
INSERT
4
Rollback
レコード1
レコード2
レコード3
レコード4
レコード5
挿入中レコード6
SYSTABLES表
CARD
6
2
Appl2
RUNSTATS
SHRLEVEL
CHANGE
3
Appl2
DB2CLP C:¥SQLLIB¥bin>db2 select tabname,card from syscat.tables where tabname='TEST_SOURCE'
TABNAME
CARD
--------------------------------------------TEST_SOURCE
6
1 レコードが選択されました。
(C)日本IBMシステムズ・エンジニアリング(株) データシステム部
第5章( 175-176 )
DB2 UDB (PC&Unix) デザイン・ガイド
ロック
Reorgchk実行時のロック
STATISTICSオプション
REORGCHKコマンドからRUNSTATSを呼び出す(Runstats実行中でも該当表を変更可能)
UPDATE(省略時)
先にRUNSTATSを実行してカタログ統計情報を更新した後、REORGCHKが実行される
RUNSTATSはTABLE and INDEX ALL options(SYSCAT.INDEXESの情報も更新される)
SHRLEVEL CHANGEが使用される
a. SYSTABLESに対してIS/NS-Lock
b. 該当表に対してIN-Lock(UR)でアクセス
c. カタログ更新(IX,X-Lock)
CURRENT
現在の統計情報より、REORGCHKを行う
ON TABLEオプション
USER
現在の認証IDを持つ表に対してREORGCHKを行う
SYSTEM
システム表(SYSIBM.xxx)に対してREORGCHKを行う
ALL
すべてのユーザー表およびシステム表(SYSIBM.xxx)に対してREORGCHKを行う
table-name
REORGCHKの対象の表を指定する
(C)日本IBMシステムズ・エンジニアリング(株) データシステム部
解説:Reorgchk実行時のロック
REORGCHKの構文
REORGCHK
UPDATE
CURRENT
STATISTICS
ON TABLE
table-name
(C)日本IBMシステムズ・エンジニアリング(株) データシステム部
第5章( 177-178 )
USER
SYSTEM
ALL
DB2 UDB (PC&Unix) デザイン・ガイド
ロック
解説:Reorgchk実行時のロック
REORGCHKにより、表と索引に対して検査を行いREORG(再編成)の必要性を判断する。
REORGCHKはデフォルトではRUNSTATSを伴う処理を行う。
REORGCHKを行い、なおかつ統計情報を更新したくない場合
REORGの必要性だけを調べたい
例えば以下のような手順により実現できる
db2 +c reorgchk on table xxx
db2 rollback
表統計レポートの例:
F1: 100*OVERFLOW/CARD < 5
F2: 100*TSIZE / ((FPAGES-1) * 4020) > 70
F3: 100*NPAGES/FPAGES > 80
CREATOR NAME
CARD
OV
NP
FP
TSIZE F1 F2 F3 REORG
------------------------------------------------------------------------------SYSIBM SYSEVENTS
- - - - --SYSIBM SYSFUNCPARMS
254
0
6
6
21590 0 100 100 --SYSIBM
SYSIBM
SYSIBM
SYSIBM
SYSIBM
SYSFUNCTIONS
SYSINDEXAUTH
SYSINDEXES
SYSKEYCOLUSE
SYSPLAN
104
2
57
4
22
0
0
17
0
0
8
1
3
1
2
8
1
5
1
2
728 0 2 100 -*112 0 - 100 --9063 29 56 60 ***
268 0 - 100 --154 0 3 100 -*-
SYSIBM
SYSPLANAUTH
41
0
1
1
1804
*"のついた項目を持つ表がREORGの候補である。
(C)日本IBMシステムズ・エンジニアリング(株) データシステム部
ブランク・
ページです
第5章( 179-180 )
0
- 100 ---
DB2 UDB (PC&Unix) デザイン・ガイド
ロック
Online Backup時のロック
BACKUPの構文
BACKUP
database-alias
DATABASE
DB
,
TABLESPACE
username
password
USING
USER
ONLINE
table space name
USE ADSM
,
TO
LOAD
OPEN
num-sessions
target-area
library-name
OPEN
WITH
SESSIONS
num-buffers
BUFFERS
num-sessions
BUFFER
SESSIONS
buffer-size
WITHOUT PROMPTING
(C)日本IBMシステムズ・エンジニアリング(株) データシステム部
解説:Online Backup時のロック
Backupの種類
DataBase
データベース全体のバックアップを取得します。
Tablespace
データベース中の表スペースを選択して、バックアップを取得します。
ログ保存式ロギング(Archived Logging)でなければなりません。
複数の表スペースにまたがる表がある時、それらのバックアップをまとめて取得しなければなりません。
例:データと索引を別表スペースに置いている時
一時表スペースを含めると、エラーとなります。
Offline backup & Online Backup
Offline Backup
排他モードでバックアップを取得します。
バックアップ取得中、他のアプリケーションはこのデータベースに接続する事ができません。
Online Backup
通常の使用状態の中で、バックアップを取得します。
ログ保存式ロギング(Archived Logging)でなければなりません。
バックアップ取得開始時間から終了時間までのログは、ロールフォワード必須です
(C)日本IBMシステムズ・エンジニアリング(株) データシステム部
第5章( 181-182 )
DB2 UDB (PC&Unix) デザイン・ガイド
ロック
Online Backup時のロック
Online BACKUP中には、DBオブジェクトを変更することが可能
2
Backup Database
IN-Lock
(Table単位でS-Lock)
IN-Lock
IN-Lock
Table Space
Table Space
Table Space
'SYSCATSPACE'
'USERSPACE1'
'AZSP1'
Table
Index
Index
Table
1
Table
Table
Table
更新処理可
能
更新処理可
能
3
Appl2
Appl1
(C)日本IBMシステムズ・エンジニアリング(株) データシステム部
解説:Online Backup時のロック
Online Backup時のロックの取得(Get Snapshot for locks on V6DB)
Application handle
Application ID
Sequence number
Application name
Authorization ID
Application status
Status change time
Application code page
Locks held
Total wait time (ms)
= 14
= *LOCAL.db2v6.000301060818
= 0001
= db2bp
= DB2V6
= Performing a Backup
= 収集されませんでした
= 932
= 16
=0
Lock Object Name = 0
Object Type
= Tablespace
Tablespace Name = SYSCATSPACE
Table Schema
=
Table Name
=
Mode
= IN
Status
= Granted
Lock Escalation = NO
Lock Object Name = 3
Object Type
= Tablespace
Tablespace Name = AZSP1
Table Schema
=
Table Name
=
Mode
= IN
Status
= Granted
Lock Escalation = NO
Lock Object Name = 2
Object Type
= Tablespace
Tablespace Name = USERSPACE1
Table Schema
=
Table Name
=
Mode
= IN
Status
= Granted
Lock Escalation = NO
(C)日本IBMシステムズ・エンジニアリング(株) データシステム部
第5章( 183-184 )
DB2 UDB (PC&Unix) デザイン・ガイド
ロック
Online Backup時にロック待ちになるケース
Online BACKUP前に、DBオブジェクトを変更した場合
2
Backup Database
IN-Lock
(Table単位でS-Lock)
IN-Lock
IN-Lock
Table Space
Table Space
Table Space
'SYSCATSPACE'
'USERSPACE1'
'AZSP1'
Table
Index
Index
Table
Table
Table
Table
Drop Table
Drop
Tablespace
Rebind
Create View
等
1
Appl2
(C)日本IBMシステムズ・エンジニアリング(株) データシステム部
解説:Online Backup時のロック
Drop Tablespace実行(未コミット)後のOnline BackupのLock-wait
DROP DBSPACE時に取得済みのZ-LockはIN-Lockとの互換性はない
Application handle
Application ID
Sequence number
Application name
Authorization ID
Application status
Status change time
Application code page
Locks held
Total wait time (ms)
=5
= *LOCAL.db2v6.000301053207
= 0001
= db2bp
= DB2V6
= Lock-wait
= 収集されませんでした
= 932
=2
= 13777
ロック待ちのサブセクション
=0
ロック保留中エージェント ID
=2
ロック保留中のアプリケーション ID
= *LOCAL.db2v6.000301051215
ロック・オブジェクト・タイプ
= Tablespace
ロック・モード
= Super Exclusive Lock (Z)
要求ロック・モード
= Intent None Lock (IN)
ロック保留中の表スペース名
= AZSP1
ロック保留中の表スキーマ
=
ロック保留中の表名
=
ロック待機開始タイムスタンプ
= 01/01/1970 09:00:00.000000
自動調整結果のロック
= NO
List Of Locks
Lock Object Name = 2
Object Type
= Tablespace
Tablespace Name = USERSPACE1
Table Schema
=
Table Name
=
Mode
= IN
Status
= Granted
Lock Escalation = NO
Lock Object Name = 0
Object Type
= Tablespace
Tablespace Name = SYSCATSPACE
Table Schema
=
Table Name
=
Mode
= IN
Status
= Granted
Lock Escalation = NO
(C)日本IBMシステムズ・エンジニアリング(株) データシステム部
第5章( 185-186 )
DB2 UDB (PC&Unix) デザイン・ガイド
ロック
解説:Online Backup時のロック
Drop Table実行(未コミット)後のOnline BackupのLock-wait(実際にはSTATUS=Lock-Waitとはならない)
Backup実行中、必要時にカタログ情報をRRでREADしようとしている(初期:IN-Lock -->情報読み込み時:S-Lock)
SYSTABLESやSYSPLAN表に既にIX-Lockを取得されていると、STATUS=ConvertingでBackupがWaitしてしまう
Drop table
----> SYSTABLESにIX-Lock
Drop Package ----> SYSPLANにIX-Lock
(Drop Table時)
Application handle
Application ID
*LOCAL.db2v6.000301060818
Sequence number
Application name
Authorization ID
Application status
Status change time
Application code page
Locks held
Total wait time (ms)
(
Drop package時)
= 14
=
= 0001
= db2bp
= DB2V6
= Performing a Backup
= 収集されませんでした
= 932
= 16
=0
List Of Locks
Lock Object Name = 7
Object Type
= Table
Tablespace Name = SYSCATSPACE
Table Schema
= SYSIBM
Table Name
= SYSPLAN
Mode
=S
Status
= Converting <== ロック・モード変換中
Lock Escalation = NO
Application handle
Application ID
*LOCAL.db2v6.000301060818
Sequence number
Application name
Authorization ID
Application status
Status change time
Application code page
Locks held
Total wait time (ms)
= 14
=
= 0001
= db2bp
= DB2V6
= Performing a Backup
= 収集されませんでした
= 932
= 16
=0
List Of Locks
Lock Object Name = 7
Object Type
= Table
Tablespace Name = SYSCATSPACE
Table Schema
= SYSIBM
Table Name
= SYSPLAN
Mode
=S
Status
= Converting <== ロック・モード変換中
Lock Escalation = NO
(C)日本IBMシステムズ・エンジニアリング(株) データシステム部
ブランク・
ページです
第5章( 187-188 )
DB2 UDB (PC&Unix) デザイン・ガイド
ロック
9.ロックを制御する指定
SQLステートメント
DECLARE CURSORのWITH HOLDオプション
CLOSEカーソルのWITH RELEASEオプション
SELECTのFETCH n ROWS ONLY
レジストリー変数
DB2LOCK_TO_RB
DB2_RR_TO_RS
DB2_NO_PKG_LOCK
ODBC,CLI,CLPの設定
AUTOCOMMIT
(C)日本IBMシステムズ・エンジニアリング(株) データシステム部
ブランク・ページです
第5章( 189-190 )
DB2 UDB (PC&Unix) デザイン・ガイド
ロック
DECLARE CURSORのWITH HOLDオプション
COMMITを越えて、カーソル位置およびカーソル位置のロックを保持
ROLLBACKが実行された場合
カーソルはCLOSEされる
ロックは解放される
LOB ロケーターは解放される
使用方法
埋め込みSQL
DECLARE CURSOR xxxx WITH HOLD
CLI SQLSetStmtAttr() のSQL_ATTR_CURSOR_HOLD属性
SQL_CURSOR_HOLD_ON :カーソル保留(省略時値)
SQL_CURSOR_HOLD_OFF :カーソル保留なし
ODBCまたはCLI
db2cli.iniファイルのCURSORHOLDキーワード [ 1 (カーソル保留:省略時値)| 0 (カーソル保留なし)]
用途
COMMITでの作業単位の完了により、ロックおよび資源の解放を行うと共に、カーソルを
OPENしたままにしておきたい場合
(C)日本IBMシステムズ・エンジニアリング(株) データシステム部
解説:DECLARE CURSORのWITH HOLDオプション
カーソルの宣言時(DECLARE CURSORステートメント)に、WITH HOLDオプションをつけてカーソルを定義することにより、COMMIT
ポイントを越えてカーソル位置を保持することが可能です。COMMITにより、行に取得されたロックは解放されますが、現在のカーソ
ル行についてのロックは保持されます。これにより、COMMIT後にFETCHを行うと、次の行からFETCH処理を継続することができま
す。
(C)日本IBMシステムズ・エンジニアリング(株) データシステム部
第5章( 191-192 )
DB2 UDB (PC&Unix) デザイン・ガイド
ロック
CLOSEカーソルのWITH RELEASEオプション
カーソルのCLOSE時に、Read Lockを全て解放する
RR,RSのアプリケーションにのみ有効
CS,URのアプリケーションについては無効
Read Lock: U,IS,U表ロック と S,NS,U行ロック
使用方法
埋め込みSQL
CLOSE カーソル名 WITH RELEASE
CLI SQLSetConnectAttr() のSQL_ATTR_CLOSE_BEHAVIOR 属性
SQL_CC_NO_RELEASE :Read Lockの解放をしない(省略時値)
SQL_CC_RELEASE :Read Lockの解放をする
用途
RR,RSのアプリケーションでの、同時稼動性を向上したい場合
ロック保持によるCPU負荷とメモリー消費を軽減したい場合
考慮点
反復不可能読み取りおよび幻像読み取りが発生する可能性がある
(C)日本IBMシステムズ・エンジニアリング(株) データシステム部
解説:CLOSEカーソルのWITH RELEASEオプション
RRまたはRSのアプリケーションで、CLOSEステートメントでカーソルをCLOSEする際にWITH RELEASEオプションをつけることによ
り、該当するカーソルの照会処理により保持されているREADロックを全て解放します。通常は、CLOSEステートメントでは、READ
ロックは解放されず、COMMITの実行により解放されます。
作業単位を終了させずに、READロックを解放することが可能です。
ただし、反復不可能読み取りおよび幻像読み取りが発生する可能性があります。
(C)日本IBMシステムズ・エンジニアリング(株) データシステム部
第5章( 193-194 )
DB2 UDB (PC&Unix) デザイン・ガイド
ロック
SELECTのFETCH FIRST n ROWS ONLY
照会結果の先頭から何行のみをアプリケーションに返すかを設定
検索条件に合致する行数にかかわらず、指定された行数のみがアプリケーションに返される
指定行数を越えてFETCHすることはできない
SQLCODE +100 (End Of File) が戻される
RSのアプリケーションでは、指定行数分の行にのみロックを取得する
使用方法
埋め込みSQL
SELECT ...... FROM 表名 FETCH FIRST n ROWS ONLY
(nは行数を指定)
CLI
SQLSetStmtAttr() のSQL_ATTR_MAX_ROWS属性で、行数を指定する。省略時値はゼロ。
DB2 V6からはこの値の設定により、ステートメントにFETCH FIRST n ROWS ONLYと、
OPTIMIZE FOR n ROWSが加えられる
用途
検索条件に合致した上位何件かのみが必要である場合
(C)日本IBMシステムズ・エンジニアリング(株) データシステム部
解説:SELECTのFETCH FIRST n ROWS ONLY
条件に合致する最初のn行のみを照会することができます。ORDER BYと併せて使用することにより、上位n番目までの結果をクラ
イアント・アプリケーションに戻すことが可能です。
n に指定された行数のみをクライアントに転送し、n を越える行数をFETCHすることはできません。もし n を越える行数をFETCH
した場合には、+100 (End Of Fileの意味)のSQLCODEがアプリケーションに戻されます。
これにより、クライアントとサーバー間に転送されるデータ量を絞り込むことができ、さらにクライアント・アプリケーションで最初の何
行かを選択するしくみを作成する必要はありません。
(C)日本IBMシステムズ・エンジニアリング(株) データシステム部
第5章( 195-196 )
DB2 UDB (PC&Unix) デザイン・ガイド
ロック
DB2LOCK_TO_RBレジストリー変数
ロック・
タイムアウト時に、ロールバックする単位を設定可能
null [省略時値]: 作業単位をロールバック
STATEMENT : タイムアウトになったSQLステートメントのみをロールバック
DB2LOCK_TO_RB=STATEMENTの場合
ロールバック時には、SQLCODE -913 RC 80 が戻される
ロールバックされたステートメントよりも先に実行された、同一作業単位内のステートメントは、
仕掛かり中のままになる
select col2 from table1 where col1=100
update table1 set col3=300 where col1=200
update table1 set col3=400 where col1=300
X取得要求
col1
NS 100
X 200
300
ロックタイムアウト発生
col2
D00
A00
B00
col3
700
600
500
このステートメントのみロールバック
用途 複数のSQLをセットで実行する必要がない場合には、ステートメントごとの実行管理が可能
(C)日本IBMシステムズ・エンジニアリング(株) データシステム部
解説:DB2LOCK_TO_RBレジストリー変数
DB2LOCK_TO_RBを Statement に設定することにより、ロック・タイムアウトによるロールバックの単位をステートメント単位に設定
することが可能です。
ロック・タイムアウトの原因になったステートメントはロールバックされますが、それ以前のステートメントについては、ロールバックさ
れません。
設定方法
db2set DB2LOCK_TO_RB=statement
(C)日本IBMシステムズ・エンジニアリング(株) データシステム部
第5章( 197-198 )
DB2 UDB (PC&Unix) デザイン・ガイド
ロック
DB2_RR_TO_RS レジストリー変数
Next key lockingの 使用/不使用の設定をする
設定後にdb2startを行うことが必要
ON :不使用
OFF [省略時値] :使用
DB2_RR_TO_RS=ONの場合
RRでバインドされているパッケージの分離レベル(Isolation Level)は、RSになる
RR(反復可能読み取り)は保証されない
システム・
カタログ表に対するアクセスには作用しない
用途
バインドし直すことなく、RRによるロック競合を避けることが可能
(C)日本IBMシステムズ・エンジニアリング(株) データシステム部
解説:DB2_RR_TO_RS レジストリー変数
DB2がロッキングおよび索引処理を行うにあたって、next key lockingが必要になりました。DB2は、特別な索引ロックを維持管理
していません。これは、全てのロックは、表あるいは行に対して行われるということになります。(表スペースへのロックは、この説明
からは省きます。)表や、行にロックが取られると、関連する索引または索引行のエントリー(キー値あるいは、RI
D)は、同じロックを
継承します。結果として、特定の索引行エントリーをロックするためには、関連した表の行をロックしなければなりません。これは、全
てのデータを、直接索引から読み込む場合でも、同じことです。
索引行が削除された場合、削除を行ったトランザクションがコミットされる前であっても、他のトランザクションからは、削除されたこと
がわかりません。一方、基本表を表スキャンする他のトランザクションからは、削除表に対するX Lockがある為、行が削除されたと
いう事実がわかります。結果として、next key lockingなしでは、表スキャンは削除行でブロックされますが、索引スキャンをブロック
するものはありません。なぜなら索引エントリーが削除されたことがわからないからです。従って、RRの要求が満たされないことにな
ります
next key lockingを使用不可能にするメカニズムがあります。しかし、使用不可能にした場合、反復可能読取り(RR)分離レベルが使
用できなくなります。
next key lockingを使用不可能にするには、データベース・インスタンスに対して、DB2_RR_TO_RSレジストリー変数をONに設定しま
す。
DB2_RR_TO_RSレジストリー変数をONに設定し、インスタンスを再始動すると、DB2はユーザー・データに対するnext key lockingを
とらなくなります。
これにより、RRはサポートされなくなり、既にRRでバインドされていた全てのパッケージは、RSにグレード・ダウンされます。
(C)日本IBMシステムズ・エンジニアリング(株) データシステム部
第5章( 199-200 )
DB2 UDB (PC&Unix) デザイン・ガイド
ロック
DB2_NO_PKG_LOCK レジストリー変数
パッケージへの内部ロック取得の有無を設定する
ON : 内部ロックを取得しない
OFF [省略時値] : 内部ロックを取得する
DB2_NO_PKG_LOCK=ON Global SQL Cacheにキャッシュされている、実行中のパッケージのエントリーを保護するため
の、パッケージに対する内部ロックを取らない
パッケージの変更(BIND,REBIND)を行った場合には、SQL1803が戻され、変更不可能
用途
パッケージの変更がない本番稼動システムに使用することによる、パフォーマンスの向上
コストをが高い、パッケージへのロック要求を削減
(C)日本IBMシステムズ・エンジニアリング(株) データシステム部
解説:DB2_NO_PKG_LOCK レジストリー変数
このレジストリー変数はV5.2から使用可能です。 Global SQL Cache について処理が行われている場合に、、既にキャッシュされて
いるパッケージのエントリーを保護するために、パッケージにロックを取得することをしません。パッケージ・ロックは内部的なシステ
ム・ロックです。パフォーマンスを向上させるために、"パッケージ・ロックを取らない"モードを選択することができます。このモードで
は、特定のデータベース処理を行うことができなくなります。以下の処理についてです。
パッケージを無効(INVALID)にする処理
パッケージを使用不可能(INOPERRATIVE)にする処理
パッケージを直接変更するような処理
この変数についての変更を有効にするためには、データベース・マネージャーは停止し、再始動する必要があります。
省略時値は OFF.
(C)日本IBMシステムズ・エンジニアリング(株) データシステム部
第5章( 201-202 )
DB2 UDB (PC&Unix) デザイン・ガイド
ロック
解説:DB2_NO_PKG_LOCK レジストリー変数
テストのシナリオ
1.ユーザーA: db2 -c- ”lock table employee on exclusive mode” (-c- : AUTOCOMMIT=OFF)
2.ユーザーB: emp
l
o
y
e
e
表を照会するプログラムを実行する
3.ユーザーC: ユーザーBが実行中のプログラムをBI
NDする
4.ユーザーD: db2 get snapshot for locks on sampledb
DB2_NO_PKG_LOCK=OFF(省略時)の場合
1.ユーザーA: db2 -c- ”lock table employee on exclusive mode” (-c- : AUTOCOMMIT=OFF)
SQLCODE 0で処理が完了
2.ユーザーB: emp
l
o
y
e
e
表を照会するプログラムを実行する
ユーザーAが、mployee表にXロックを取得しているため、LOCK−WAI
T
になる
3.ユーザーC: ユーザーBが実行中のプログラムをBI
NDする
ユーザーBが、パッケージに内部ロックを取得しているため、LOCK−WAI
T
になる
DB2_NO_PKG_LOCK=ONの場合
1.ユーザーA: db2 -c- ”lock table employee on exclusive mode” (-c- : AUTOCOMMIT=OFF)
SQLCODE 0で処理が完了
2.ユーザーB: emp
l
o
y
e
e
表を照会するプログラムを実行する
ユーザーAが、mployee表にXロックを取得しているため、LOCK−WAI
T
になる
3.ユーザーC: ユーザーBが実行中のプログラムをBI
NDする
ユーザーBが、パッケージに内部ロックを取得していないが、DB2_NO_PKG_LOCK=ONの場合には、パッケージ
に変更を与える処理は許可されないため、SQL1803が戻される。
SQL1803N 要求された操作は、 "パッケージ・ロックなし" モードでは実行されません。影響を受けるパッケージは
"UDBV61.STATIC" です。 SQLSTATE=57056
SQL0082C エラーが発生したため、処理は終了しました。
(C)日本IBMシステムズ・エンジニアリング(株) データシステム部
解説:DB2_NO_PKG_LOCK レジストリー変数
DB2_NO_PKG_LOCK=OFF(省略時)の場合の、SNAPSHOTの出力
Application handle
Application ID
Sequence number
Application name
Authorization ID
Application status
Status change time
Application code page
Locks held
Total wait time (ms)
= 127 <=LOCKステートメントを実行したユーザー
= *LOCAL.udbv61.990623021604
= 0001
= db2bp
= UDBV61
= UOW Waiting
= 収集されませんでした
= 943
=5
= 収集されませんでした
List Of Locks
Lock Object Name = 6
Object Type
= Table
Tablespace Name = USERSPACE1
Table Schema
= UDBV61
Table Name
= EMPLOYEE
Mode
=X
Status
= Granted
Lock Escalation = NO
(途中省略)
(C)日本IBMシステムズ・エンジニアリング(株) データシステム部
第5章( 203-204 )
DB2 UDB (PC&Unix) デザイン・ガイド
ロック
解説:DB2_NO_PKG_LOCK レジストリー変数
Application handle
Application ID
Sequence number
Application name
Authorization ID
Application status
Status change time
Application code page
Locks held
Total wait time (ms)
= 130 <=プログラムを実行したユーザー
= *LOCAL.udbv61.990623022415
= 0001
= static
= UDBV61
= Lock-wait
= 収集されませんでした
= 943
=1
= 収集されませんでした
List Of Locks
Lock Object Name = 0
Object Type
= Internal P Lock <=パッケージに対する内部ロック
Tablespace Name =
Table Schema
=
Table Name
=
Mode
=S
Status
= Granted
Lock Escalation = NO
Application handle
Application ID
Sequence number
Application name
Authorization ID
Application status
Status change time
Application code page
Locks held
Total wait time (ms)
= 132 <=BINDを実行したユーザー
= *LOCAL.udbv61.990623022517
= 0001
= db2bp
= UDBV61
= Lock-wait
= 収集されませんでした
= 943
=0
= 収集されませんでした
(C)日本IBMシステムズ・エンジニアリング(株) データシステム部
ブランク・ページです
第5章( 205-206 )
DB2 UDB (PC&Unix) デザイン・ガイド
ロック
AUTOCOMMIT
各SQL単位に自動的にCOMMITを実行するかを設定する
使用方法
db2cli.ini
AUTOCOMMIT ( 0 :OFF
1:省略時値で、ON)
CLI
SQLSetConnectAttr() のSQL_ATTR_AUTOCOMMIT
SQL_AUTOCOMMIT_ON :(省略時値) SQLステートメント実行ごとに自動的にCOMMITが実行される
照会処理の場合、カーソルのCLOSE直後にCOMMITが実行される
SQL_AUTOCOMMIT_OFF :SQLTransact()で明示的にCOMMITを実行する
CLP (コマンド行プロセッサー)
CLPコマンド・オプションで設定する
-c
:(省略時値)AUTOCOMMITはON
+c または -c- :AUTOCOMMITはOFF
方法1:CLP実行時に指定する
db2 −c− または db2 +c を付けてSQLを実行する
(例)db2 -c- "update table2 set col2=123 where col2='ABC' "
方法2:あらかじめCLPのコマンド・オプションの設定をしておく
CLPコマンド・オプションの設定: db2set DB2OPTIONS = '+c'
CLPコマンド・オプションの確認: db2 list command options
(C)日本IBMシステムズ・エンジニアリング(株) データシステム部
解説:AUTOCOMMIT
CLPで設定されているコマンド・オプションを、以下のコマンドにより画面表示し確認することができます。
CLPコマンド・オプションの確認: db2 list command options
(出力例)
コマンド行プロセッサーのオプション設定
バックエンド・
プロセス待ち時間 (秒)
(DB2BQTIME) = 1
バックエンド接続の再試行回数 (DB2BQTRY) = 60
要求待ち行列待ち時間 (秒) (DB2RQTIME) = 5
入力待ち行列待ち時間 (秒) (DB2IQTIME) = 5
コマンド・オプション
(DB2OPTIONS) = +c <== DB2OPTIONSによるコマンド・オプションの設定
オプション 説明
現在の設定
------ ---------------------------------------- ---------------a
SQLCA を表示する
OFF
-c 自動コミット
OFF <== AUTOCOMMITの設定 -e SQLCODE/SQLSTATE を表示する OFF
-f 入力ファイルから読み込む
OFF
-l 履歴ファイルにコマンドのログをとる
OFF
-o
出力を表示する ON
-p
対話式入力プロンプトを表示する ON
-r
出力を報告書ファイルに保管する
OFF
-s コマンド・エラーで実行を停止する
OFF
-t ステートメントの終了に文字を設定する
OFF
-v 現行コマンドをエコーする
OFF
-w
FETCH/SELECT 警告メッセージを表示する
ON
-z
出力ファイルにすべての出力を保管する
OFF
(C)日本IBMシステムズ・エンジニアリング(株) データシステム部
第5章( 207-208 )
DB2 UDB (PC&Unix) デザイン・ガイド
ロック
解説:AUTOCOMMIT
CLPを使用したロック取得の確認テスト方法 例:
1.テストしたいISOLATIONレベルを設定する
db2 "change isolation to RS"
2.データベースに接続する(データベースに接続後には、ISOLATIONレベルの変更は不可能)
db2 connect to DBNAME
3.CLP実行時に、AUTOCOMMIT=OFFを設定しながらSQLを実行する
db2 -c- "select * from table1 where col1 = '2000'"
4.COMMITを実行する前に、ロック・スナップショットを取得する
db2 get snapshot for locks on DBNAME
(C)日本IBMシステムズ・エンジニアリング(株) データシステム部
ブランク・ページです
第5章( 209-210 )
DB2 UDB (PC&Unix) デザイン・ガイド
ロック
10.いろいろな機能とロック
NOT LOGGED INITIALLY使用時のロックの考慮点
Declared Temporary Table(宣言済み一時表)
とロック
Savepointとロック
(C)日本IBMシステムズ・エンジニアリング(株) データシステム部
ブランク・ページです
第5章( 211-212 )
DB2 UDB (PC&Unix) デザイン・ガイド
ロック
NOT LOGGED INITIALLY使用時のロックの考慮点
CREATE TABLEのNOT LOGGED INITALLY属性
CREATE TABLEステートメントと同じ作業単位内の更新処理について、ログをとらない
更新処理: INSERT,DELETE,UPDATE,CREATE INDEX,DROP INDEX, ALTER TABLE
考慮点
カタログ表にロックを取得し続けることで発生する、ロックの競合を防ぐため、以下の手順での
使用が望ましい
1.NOT LOGGED INTIALLY属性付きでCREATE TABLE後にCOMMITを行う
これにより、DB2のカタログ表へのロックを外す
2.別の作業単位でALTER TABLEによりNOT LOGGED INTIALLY属性の活動化を行う
3.更新処理を行う
CREATE TABLE ......
COMMIT ;
ALTER TABLE ......
更新処理 ; COMMIT ;
NOT LOGGED INITIALLY ;
ACTIVATE NOT LOGGED INITIALLY ;
(C)日本IBMシステムズ・エンジニアリング(株) データシステム部
ブランク・ページです
第5章( 213-214 )
DB2 UDB (PC&Unix) デザイン・ガイド
ロック
Declared Temporary Table(宣言済み一時表)とロック
Declared Temporary Table(宣言済み一時表)
には、ロックは取得され
ない
1アプリケーション固有の一時表であり、排他制御の必要性がないため
ワーク領域としての一時的な表を使用するアプリケーションに有効
システム・
カタログ表にロックを取得しない
Declared Temporary Table(宣言済み一時表)にロックを取得しない
更新ログを記録しない
USER Temporary Tablespace
session.t1
appl1
appl2
session.t1
session.t1
Declare global temporary
table t1 ........
appl3
(C)日本IBMシステムズ・エンジニアリング(株) データシステム部
解説:Declared Temporary Table(宣言済み一時表)とロック
宣言済み一時表とは
宣言済み一時表 とは、一時表を作成したアプリケーションによって発行された SQL ステートメントにのみアクセス可能な一時表
を表します。宣言済み一時表は、アプリケーションがデータベースに接続している間しか有効ではありません。
宣言済み一時表を使用して、アプリケーションの潜在的パフォーマンスの向上を図ってください。宣言済み一時表を作成する場
合には、 DB2 はシステム・カタログ表に項目を挿入しないため、サーバーでカタログの競合による問題が起きることはありませ
ん。通常の表の場合とは異なり、DB2 は宣言済み一時表またはその行をロックせず、宣言済み一時表またはその表の内容をロ
グしません。現行のアプリケーションで多量のデータを処理するために表を作成し、アプリケーションによるデータの操作が終了
する際にそれらの表を除去する場合には、通常の表のかわりに宣言済み一時表を使用することを検討してください。
並行ユーザー用にアプリケーションを開発する場合には、宣言済み一時表が役立ちます。通常の表とは異なり、宣言済み一時
表では名前が重複しても問題は起こりません。アプリケーション各インスタンスでは、 DB2 は同じ名前の宣言済み一時表を作
成することができます。たとえば、多量の一時データを処理するのに通常の表を使用する並行ユーザーのためにアプリケーショ
ンを作成する場合には、アプリケーションの各インスタンスが一時データを保持する通常の表に対して固有な名前を使用する必
要があります。一般的には、ある時点で使用されている表の名前をたどる別の表を作成します。しかし、宣言済み一時表を使用
すると、一時データに対して 1つの宣言済み一時表を指定するだけで済みます。 DB2 は、アプリケーションの各インスタンスで
固有な表が使用されていることを保証します。
一時表の使用例
/*一時表の作成*/
DECLARE GLOBAL TEMPORARY TABLE T1 ( ID smallint not null, DATA integer, TEXT char(30) )
ON COMMIT DELETE ROWS
NOT LOGGED
IN USR_TEMP_TS;
/*一時表へのINSERT*/
INSERT INTO SESSION.T1
SELECT c1,c2,c3 FROM REAL_T1 WHERE DEPTNO=:mydept;
/* 一時表の削除 */
DROP TABLE SESSION.T1
(C)日本IBMシステムズ・エンジニアリング(株) データシステム部
第5章( 215-216 )
DB2 UDB (PC&Unix) デザイン・ガイド
ロック
Savepointを使用した時のロック
SavepointまでROLLBACKした後も、ロックは保持される
On rollback release locksやOn rollback close cursorsはサポートされていない
ROLLBACK TO SAVEPOINT後に、処理のやり直しを行う場合のロック競合を防ぐため
使用例:
SAVEPOINT S1 ON ROLLBACK RETAIN CURSORS;
INSERT INTO MYTAB (C1, C2) VALUES (2,3);
INSERT INTO MYTAB (C1, C2) VALUES (2,1);
INSERT INTO MYTAB (C1, C2) VALUES (245,5);
ROLLBACK TO SAVEPOINT S1;
INSERT INTO MYTAB (C1, C2) VALUES (2,300);
INSERT INTO MYTAB (C1, C2) VALUES (200,3);
COMMIT;
実行結果
C1 C2 2 300
200 3
SAVEPOINT A;
処理A
ROLLBACK!
ROLLBACK TO SAVEPOINT A;
SAVEPOINT B;
処理B
利点
作業単位(UOW)の最初まで戻ることなく、処理のやり直し
が可能
ROLLBACK!
ROLLBACK TO SAVEPOINT B;
COMMI
T;
(C)日本IBMシステムズ・エンジニアリング(株) データシステム部
解説:Savepointを使用した時のロック
SAVEPOINTとはデータベースへのSQL処理が失敗した場合に、あるポイントまで処理をROLLBACKするしくみです。SAVEPOINT
ステートメントは、トランザクション処理の中で現在の位置に名前を与え、マークします。ROLLBACK TO ステートメントで、マークさ
れたSAVEPOI
NT名を指定すると、トランザクション全体ではなく、一部のみをROLLBACKさせることが可能です。
構文:
>>--SAVEPOINT-----savepoint-name--*--+----------+--*------------------->
'--UNIQUE--'
.--ON ROLLBACK RETAIN LOCKS--.
>--ON ROLLBACK RETAIN CURSORS--*--+----ー------------------------+--*----><
SAVEPOINT :
UNIQUE : SAVEPOINTが活動化されている間、アプリケーションからそのSAVEPOINT名を再使用しない場合の指定
ON ROLLBACK RETAIN CURSORS : SAVEPOINTを発行した後にOpenされたカーサーに関してRollback To SAVEPOINTによ
る影響。カーサーはRollback to Savepoint発行後も影響を受けない。ただし、SAVEPOINT後DDLで変更された従属に関しての
カーサーはInvalidate (SQLCODE -910)になる。
ON ROLLBACK RETAIN LOCKS : SAVEPOINTを発行した後にLockされたカーサーにObjectに関するRollback To
SAVEPOINTによる影響。LockはRollback to Savepoint発行後も影響を受けず、保持される。
RELEASE SAVEPOINT : マークされたSAVEPOINTを解放する。明示的なRelease Savepointを発行しなければTransaction
endにて解放される。解放されたSavepointをRollbackでUndoすることはできない。
ROLLBACK TO SAVEPOINT : SAVEPOINTまでROLLBACKする。この場合以下のカーサーが影響を受ける
考慮事項
SAVEPOINT内のDDL(CREATE VIEW,ALTER,CREATE ALIAS等)で作成されたOBJECTを参照するカーサーは、ROLLBACK
後使用できない(SQLCODE -910,SQLSTATE=57007)
SAVEPOINT内で参照されているカーサーは、OPEN状態は保たれFETCH時は整合性をもった値を返す
上記以外のカーサーは、ROLLBACK後影響を受けない
LOCKはROLLBACK TO SAVEPOINT後も保持される
LOB LocatorはROLLBACK TO SAVEPOINT後も参照可能
(C)日本IBMシステムズ・エンジニアリング(株) データシステム部
第5章( 217-218 )
DB2 UDB (PC&Unix) デザイン・ガイド
ロック
11.Quiesce(1)
Quiesceとは
表スペースおよび指定した表単位にとられる排他制御
表スペース:互換性のないモードでのQuiesceの取得は不可
Quiesceコマンドで指定された表:互換性のないモードでのQuiesceの取得、および処理は不可
Quiesceコマンドで指定されていない表:更新処理以外は可能
LOADユーティリティーは内部的にQUIESCE Exclusiveを取得している
HOLD QUIESCE オプションにより、明示的に取得することも可能
ロックとは異なる性質
既存のQuiesceモードに反する処理は即時エラーとなり、WAITはしない
ロック・スナップショットには表示されない
Quiesce取得状況の確認
LIST TABLESPACES (SHOW DETAIL) コマンド
Quiesceの取得方法
QUIESCE TABLESPACES FOR TABLE 表名 [ SHARE | INTENT TO UPDATE | EXCLUSIVE | RESET ] コマンド
SHARE
:共有モード
INTENT TO UPDATE:更新意図モード
EXCLUSIVE
RESET
:排他モード
:既存のQuiesceの解除
(C)日本IBMシステムズ・エンジニアリング(株) データシステム部
解説:Quiesce(1)
互換性のない処理に対するエラー
SQL0290N:表スペース・アクセスが許されていません
(例)既存のQuiesceモードに反するSQL処理を行おうとした場合
SQL3805N:アプリケーション、または指定された表の1つ以上の表スペース状態が、loadapiアクションまたは
quiescemode"y"を禁止しています理由コード='n'
(例)既存のQuiesceと互換性のないQuiesceモードを取得しようとした場合
QUIESCE取得状況の確認
1.db2 "quiesce tablespaces for table TESTTAB1 share "
2.db2 "list tablespaces show detail" の出力
表スペース ID
名前
タイプ
内容
状況
詳しい説明:
静止: SHARE
合計ページ数
使用可能ページ数
使用したページ
空きページ
最高水準点 (ページ) ページ・
サイズ (バイト)
エクステント・
サイズ (バイト)
プリフェッチ・サイズ (バイト)
コンテナー数
最小回復時間 静止状態の数
静止状態 1:
表スペース ID
オブジェクト ID
=4
= TBLTBS
= データベース管理スペース
= 任意のデータ
= 0x0001
= 1000
= 992
= 736
= 256
= 736
= 4096
= 32
= 32
=1
= 2000-01-20-08.28.15.000000
=1
=4
=9
オブジェクトID:SYSCAT.TABLESのTABLEID列にある、表の識別番号
(C)日本IBMシステムズ・エンジニアリング(株) データシステム部
第5章( 219-220 )
DB2 UDB (PC&Unix) デザイン・ガイド
ロック
Quiesce(2)
Phantom Quiesce
Quiesceを取得したユーザーのデータベース接続が無くなり、所有者がいなくなったQuiesce
以下の処理が可能
別のユーザーが同じモードのQuiesceをコマンド実行により取得する
別のユーザーがRESETする
互換性
Share
取得要求の
Intent to update
Quiesceモード
Exclusive
既存のQuiesceモード
Share
Intent to update
〇
〇
〇
×
×
×
(C)日本IBMシステムズ・エンジニアリング(株) データシステム部
ブランク・ページです
第5章( 221-222 )
Exclusive
×
×
×
DB2 UDB (PC&Unix) デザイン・ガイド
ロック
12.ロックのまとめ(1)
同時稼動性を高めるには
作業単位の区切りには必ずCOMMITを入れ、できるだけ早くロックを解放する
照会処理でもロック(Read Lock)は取得されるため、RR、RSのアプリケーションでも作業単位の区切りに必ず
COMMITを入れる
CLOSEカーソル WITH RELEASEを利用する
URのアプリケーションでも、動的SQLの場合にはカタログへのロックが取得される
COMMITされていない更新データは、他のアプリケーションからアクセスすることはできない
URのアプリケーションを除く
アプリケーション要件を満たすロックの制御を行うには
アプリケーションに適切なISOLATIONレベルを選択する
ロックの単位を用途に応じて設定する
LOCK TABLEにより表全体にロックを取得することが可能
ALTER TABLEによりロックの単位をROWまたはTABLEに設定することが可能
パフォーマンスを向上させるには
ロックに関する構成パラメーターのチューニング
モニタリング・ツールによる監視
(C)日本IBMシステムズ・エンジニアリング(株) データシステム部
ブランク・ページです
第5章( 223-224 )
DB2 UDB (PC&Unix) デザイン・ガイド
ロック
ロックのまとめ(2)
問題判別を行うには
イベント・モニター、ロック・スナップショットによる原因究明
UDB/EEEのdb2_call_stackユーティリティ
全てのDB2プロセスにシグナル36を送信し、それぞれのコーリング・スタックをDIAGPATH上の、ファイル(txxxx.yyy)
にダンプさせる
ハング・タイプの状況で役立つ
2、3分のコール・スタックの変更を見るのに役立つ
(C)日本IBMシステムズ・エンジニアリング(株) データシステム部
ブランク・ページです
第5章( 225-226 )
DB2 UDB (PC&Unix) デザイン・ガイド
ロック
ブランク・ページです
ブランク・ページです
第5章( 227-228 )
Fly UP