[DB][DB2] 分離レベル

分離レベル
トランザクションの1属性で分離性(Isolation)がある。

分離性:
トランザクションの実行結果が同時に実行される他のトランザクションの影響をどれだけ受けないか
という属性。

DB2
ISOが規定している4つの分離レベルをサポート。
ISO SQLの分離レベルは 3つの事象の発生有無で定義される。

*3事象
 -未コミット読み取り
 -反復不能読み取り
 -幻像読み取り

■SQLトランザクション分離レベルと3現象
RR
ISO SQL標準分離レベル: SERIALIZABLE
DB2 分離レベル: REPEATABLE READ 【RR】 / 反復可能読み取り
不発生保証
 -○ : 未コミット読み取り
 -○ : 反復不能読み取り
 -○ : 幻像読み取り
トランザクション中で何度同じSELECTを実行しても、同じ行数と内容。
理想的な分離レベル。
トランザクションの実行結果は他のトランザクションの影響を全く受けない。

RS
ISO SQL標準分離レベル: REPEATABLE READ
DB2 分離レベル: READ STABILITY 【RS】 / 読み取り固定
-多 : ロック待ち
-低 : 同時並行稼動性
防止保証
 -○ : 未コミット読み取り
 -○ : 反復不能読み取り
 -× : 幻像読み取り
トランザクション内で一度SELECTできた行は、サイドSELECTしても同じ内容。
ただし、
同トランザクション中で同一SELECTの再発行でも、
他トランザクションでの追加結果が反映されるため、行数は同一とは限らない。(幻像読み取り現象)

CS
ISO SQL標準分離レベル: READ COMMITED
DB2 分離レベル: CURSOR STABILITY 【CS】 / カーソル固定
防止保証
 -○ : 未コミット読み取り
 -× : 反復不能読み取り
 -× : 幻像読み取り
トランザクション内でSELECTできた行はCOMMITされたもののみ。
ただし、
トランザクション中で同一SELECTの再発行しても、
異なる内容だったり、削除されている場合あり。(反復不能読み取り現象)


UR
ISO SQL標準分離レベル: READ UNCOMMITED
DB2 分離レベル: UNCOMMITED READ 【UR】 / 非コミット読み取り
-少 : ロック待ち
-高 : 同時並行稼動性
防止保証
 -× : 未コミット読み取り
 -× : 反復不能読み取り
 -× : 幻像読み取り
トランザクション内ではCOMMITされていない行もSELECTできる。
SELECTした行はその後ROLLBACKされてしまう場合あり。(非コミット読み取り)


□分離レベルの選択
ロック待ち 少 = 同時並行稼動性
非コミット/反復不能/幻像読取の防止 ←トレードオフ→ 同時並行稼動性


■分離レベルの指定方法
各単位で分離レベルを指定できる。
-アプリ単位
-埋め込みSQL
-SQL文
-CURRENT ISOLATION特殊レジスタ

□CLI型アプリでの指定
ODBC、CLI、JDBC、VB ADOなどのCLI型のアプリは、
省略時の分離レベルをdb2cli.iniファイルのTXNISOLATION=パラメータで指定する。
-TXNISOLATION=1|2|4|8|32
 (順に、UR|CS|RS|RR|NC。省略時は、2=CS。32は、DB2/400のみ。)
*CLI
 実行時:SQLSetConnectAttr関数/SQLSetStmtAttr関数のSQL_ATTR_TXN_INSOLATION属性
 -SQL_TXN_SERIALIZABLE
 -SQL_TXN_REPEATABLE_READ
 -SQL_TXN_READ_COMMITED
 -SQL_TXN_READ_UNCOMMITED
*JDBC
 実行時:setTransactionIsolationメソッド
 -TRANSACTION_SERIALIZABLE
 -TRANSACTION_REPEATABLE_READ
 -TRANSACTION_READ_COMMITED
 -TRANSACTION_READ_UNCOMMITED
*VB ADO
 実行時:con.IsolationLevelプロパティ
 -adXactSerializable
 -adXactRepeatableRead
 -adXactReadCommited
 -adXactReadUncommited

□埋め込みSQLでの指定
ソースプログラムのプリコンパイル/バインドを必要とする埋め込みSQL型プログラミングでは、
プリコンパイル・バインドしてパッケージを作る際のISOLATIONパラメータで分離レベルを指定する。
*埋め込みSQL
 PRECOMPILE/BINDコマンドのISOLATIONパラメータUR,CS,RS,RR
*SQLプロシージャ
 CREATE PROCEDUREの実行でプリコンパイル・バインドが実行されパッケージが作成されるが、
 db2set DB2_SQLROUTINE_PREPOPTSで指定できるプリコンパイル・オプションの1つであるISOLATIONパラメータで指定する。
*DB2コマンド行プロセッサ
 CHANGE ISOLATION TOというCLPコマンドでCONNECT前に分離レベルを変更する。
 DB2 CLPのパッケージはDB2が提供している。
 各分離レベルのパッケージが予め提供されいて切り替えて使われる。
*SQLJ
 db2profcコマンドの-prepoptionsのISOLATIONパラメータ

□SQL文での指定
個々のSQL文に対して分離レベルが指定できる。
以下のSQLにWITHキーワードを使って指定する。
-SELECT
-SELECT INTO
-DELETE (CURSORなし)
-INSERT
-UPDATE (CURSORなし)
-DECLARE CURSOR
注意点
-副照会にはWITH指定できない。
-WITH指定を省略のSQLはパッケージの分離レベルになる。
-WITH URを読み取り専用SQL以外に指定してもWITH CSとして扱われる。

 SELECT * FROM TBL WHERE HOGE=PIYO WITH UR

□CURRENT ISOLATION特殊レジスタでの指定
CURRENT ISOLATION特殊レジスタ
 現行セッション内で発行された動的SQL文の分離レベルを識別する値を保持してる。
 デフォルトはブランク(パッケージの分離レベル)。
 セッションが終了するまで、またはRESETオプションを使用してSET CURRENT ISOLATION文が発行されるまで存続する。
 値はSET CURRENT ISOLATION文で変更できる。
SET CURRENT ISOLATION文
 アプリへの組み込み、または動的SQLステートメントとして使用する。
 実行後、即有効になる。

 SET CURRENT ISOLATION = RR


ref:
簡単シリーズ アプリケーションデザインのためのロックの基本(★★★★☆)
http://download.boulder.ibm.com/ibmdl/pub/software/dw/jp/db2/ds/techdoc/lock_v8.pdf

tag : DB2 RR RS CS UR 分離レベル

2009-04-09 07:10 : 開発 : コメント : 0 : トラックバック : 0 :
コメントの投稿
非公開コメント

« next  ホーム  prev »

search

ad



counter


tag cloud

category cloud