SQLでのレコード・ロックはどのようになるのだろうか?
更新用にアクセスして入手したレコードにロックをかけて排他制御しておかないと
他のユーザーから不用意に更新されてしまい更新の結果が誤ったものになってしまうからである。
レコード・ロックの重要性の説明は他の機会に譲ることにしてここでは
SQLによるレコード・ロックについて調べてみよう。
最初に対話式SQLで
SQL ステートメントの入力
SQL ステートメントを入力して,実行キーを押してください。
現在の接続相手はリレーショナル・データベース Sxxxxxx である。
===> SELECT * FROM QTRFIL/SHOHIN WHERE SHCODE = 'A004'
というように SELECT文を実行してみる。
データの表示 行の位置指定 . . . . . . . ....+....1....+....2....+....3....+....4....+....5....+....6... 商品コード 商品名 単価 品種コード A004 TEST A004 134,000 0001 ******** データの終わり ********
このように実行結果としてSQLによる選択結果が表示される。
この状態で別のジョブから
DSPRCDLCK FILE(QTRFIL/SHOHIN)
によってこのファイルのレコード・ロック状況を調べてみると
メンバー・レコード・ロックの表示
システム :
ファイル . . . . . . : SHOHIN メンバー . . . . . . : SHOHIN
ライブラリー . . . : QTRFIL
レコード ロック
番号 ジョブ ユーザー 番号 状況 タイプ
( 指定したメンバーのレコード・ロックは見つからない。 )
のようにしてレコードは何もロックされていないことがわかる。
これは単純な SELECT文による照会なので当然、レコードがロックされることはない。
次に SELECT文に FOR UPDATE WITH RS を付加して実行してみる。
SQL ステートメントの入力
SQL ステートメントを入力して,実行キーを押してください。
現在の接続相手はリレーショナル・データベース Sxxxxxx である。
===> SELECT * FROM QTRFIL/SHOHIN WHERE SHCODE = 'A004' FOR UPDATE WITH RS
SQLで更新用としてレコードをアクセスする場合は FOR UPDATE を付加する。
特に IBM i であるDB2の場合はさらに WITH RS を付加すると
インターネットなどで紹介されているので付加して実行して
レコード・ロックの状況を調べてみると
メンバー・レコード・ロックの表示
システム : S
ファイル . . . . . . : SHOHIN メンバー . . . . . . : SHOHI
ライブラリー . . . : QTRFIL
レコード ロック
番号 ジョブ ユーザー 番号 状況 タイプ
39 QPADEV000F QTR 833473 保留 READ
のようにしてレコード・ロックがかかっていることがわかる。
このレコード・ロックはSQLの結果の表示を終了したり対話式SQLを終了しても
レコード・ロックが外れることはない。
対話式SQLで COMMIT を実行しない限りレコード・ロックは継続する。
これがSQLによるレコード・ロックである。
ちなみにこのデータ・ベース: QTRFIL/SHOHIN にはジャーナルは設定されていない。
たとえジャーナルの設定のないファイルであっても対話式SQLのレコード・ロックは
有効に働いていることになる。