DFU, Query, SQL

55. SQLでのレコード・ロック

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を終了しても
レコード・ロックが外れることはない。
対話式SQLCOMMIT を実行しない限りレコード・ロックは継続する。

これがSQLによるレコード・ロックである。
ちなみにこのデータ・ベース: QTRFIL/SHOHIN にはジャーナルは設定されていない。
たとえジャーナルの設定のないファイルであっても対話式SQLのレコード・ロックは
有効に働いていることになる。