COBOL言語の「SHARING句」を活用してファイル共有をしよう | 用語辞典

COBOL(コボル)言語の予約語SHARING句を使った命令文の書き方とは

辞典・辞書-SHARING-イメージ

COBOL(コボル)言語のSHARING句とは?

COBOL(コボル)におけるSHARING句は、ファイルの共有及び共有時のレコードへのアクセス制限を行うときに指定します。

共有モードの指定は、SELECT句またはOPEN文のどちらかにSHARING句を記述します。

書き方:

SHARING WITH 共有モード

SHARING句における共有モードは「NO OTHER(排他モード)」「READ ONLY(読み取り専用モード)」「ALL OTHER(全てのユーザーと共有)」の3種類があります。

  • NO OTHER(排他モード)

ファイルの制御が排他的であることを示します。指定したファイルが他のプログラムでOPENした場合、排他ロックがかかり、ファイルのOPENは失敗します。

NO OTHERではレコードのロックは有効となりません。

  • READ ONLY(読み取り専用モード)

指定したファイルが、他のプログラムと同時にアクセスした場合に入力モードのみとなります。

READ ONLYではレコードのロックが有効となります。

  • ALL OTHER(全てのユーザーと共有)

他のプログラムと同じOPENモードを指定したファイルに対して、ファイル共有の制限モードに従ってファイルのアクセスを許可します。

ALL OTHERではレコードのロックは有効となります。

使用例:

ファイルのレコードの共有指定を行う簡単なサンプルを紹介します。

読み込むファイルは事前に用意しておきます。ここでは、行順編成のフラット形式で以下のように記述したレコードを使用します。

test.txt-------------------

AAAAA

BBBBB

CCCCC

DDDDD

----------------------------

辞典・辞書-SHARING-使用例

実行結果:

辞典・辞書-SHARING-実行結果

サンプルではSELECT句でファイルの共有をREAD ONLY(読み取り専用モード)で指定しています。

読み取り専用モードを指定しておけば、READ文のファイルを読み込むときに自動的にレコードがロックされるため、他のプログラムから同じファイルに対してレコードの書き込みができなくなります。

SHARING句のCOBOL(コボル)言語における基本事項やルールについて

  1. SHARING WITH、共有モードなどの間の空白や改行は自由に指定できます。
  2. SHARING句は「NO OTHER(排他モード)」「READ ONLY(読み取り専用モード)」「ALL OTHER(全てのユーザーと共有)」のいずれかを指定する必要があります。
  3. SHARING句を指定してOPENされたファイルに対して、別のプログラムから同じファイルを実行した場合、モードによってはファイルのOPENが成功したり、失敗したりします。
  4. OPEN文でWITH LOCK句を指定した場合は、共有モードが「WITH NO OTHER(排他モード)」となります。
  5. SELECT句でLOCK句のEXCLUSIVE(排他ロック)を指定した場合は、共有モードが「WITH NO OTHER」となります。
  6. LOCK句でAUTOMATIC(自動ロック)またはMANUAL(手動ロック)をSELECT句で指定した場合は、共有モードが「ALL OTHER(全てのユーザーと共有)」となります。
  7. OPEN文でのモードがOUTPUT、I-O、EXTENDの場合は、共有モードが「WITH NO OTHER(排他モード)」となります。

COBOL(コボル)言語のSHARING句を扱う上での注意点

SHARING句はSELECT句でのファイル記述項と、OPEN文で記述することができますが、SELECT句とOPEN文で両方にSHARING句の記述があった場合、OPEN文での指定を優先してしまいます。

そのため、プログラムを担当者から引き継いだときなど、新たにSHARING句を使用する場合は、前担当者がOPEN文にSHARING句の記述をしていないか、確認する必要があります。

特にファイルを扱った複雑な処理ではファイル操作でOPEN文を多用しますので、注意が必要です。

以下のようにファイル記述項でSHARING句のREAD ONLYを、OPEN文でALL OTHERを指定した場合は、ALL OTHERが優先されます。

   
  1. FILE-CONTROL.
  2. SELECT TEST-FILE ASSIGN TO 'test.txt'
  3. ORGANIZATION IS LINE SEQUENTIAL
  4. SHARING WITH READ ONLY
  5.  
  6. ...
  7.  
  8. OPEN I-O SHARING WITH ALL OTHER TEST-FILE.

SHARING句を使ったCOBOL(コボル)プログラムの活用法

ファイルの共有・非共有をする上で、ファイルの競合を防ぐためにSHARING句は有効な手段です。

ここでは、SHARING句を使用して、実際に他のプログラムとファイル操作が競合したときの動作を紹介します。

以下のサンプルでは、sharing02-1.cobをループで1000000回書き込みを実施し、sharing02-2.cobではSHARING句のNO OTHER(排他モード)を指定して、書き込み処理を実行しています。

また、ここではプログラムの並列処理を実現するために、Unix/Linux系OSやMac OSで使用できる簡単なシェルスクリプトを実行して、動作を確認しています。

sharing02-1.cob:

   
  1. IDENTIFICATION DIVISION.
  2. PROGRAM-ID. SHARING_SAMPLE02-1.
  3. ENVIRONMENT DIVISION.
  4. INPUT-OUTPUT SECTION.
  5.  
  6.  
  7. FILE-CONTROL.
  8. SELECT WORK-FILE ASSIGN TO 'work.txt'
  9. ORGANIZATION IS LINE SEQUENTIAL.
  10.  
  11.  
  12. DATA DIVISION.
  13. FILE SECTION.
  14. FD WORK-FILE.
  15. 01 OUT-FILE-REC PIC 9(5).
  16.  
  17. WORKING-STORAGE SECTION.
  18. 01 LINE-COUNT PIC 9(5) VALUE 0.
  19.  
  20. PROCEDURE DIVISION.
  21.  
  22. *>------------------------------
  23. *> ファイルの書き込み
  24. *>------------------------------
  25.  
  26. OPEN OUTPUT WORK-FILE.
  27.  
  28. *>1000000回ループする
  29. PERFORM 1000000 TIMES
  30. *>1を加算する
  31. ADD 1 TO LINE-COUNT
  32.  
  33.  
  34. MOVE LINE-COUNT TO OUT-FILE-REC
  35.  
  36.  
  37. WRITE OUT-FILE-REC
  38.  
  39.  
  40. END-PERFORM.
  41.  
  42.  
  43. CLOSE WORK-FILE.
  44.  
  45.  
  46. STOP RUN.

sharing02-2.cob:

   
  1. IDENTIFICATION DIVISION.
  2. PROGRAM-ID. SHARING_SAMPLE02-2.
  3. ENVIRONMENT DIVISION.
  4. INPUT-OUTPUT SECTION.
  5.  
  6.  
  7. FILE-CONTROL.
  8. SELECT WORK-FILE ASSIGN TO 'work.txt'
  9. ORGANIZATION IS LINE SEQUENTIAL
  10. SHARING WITH NO OTHER.
  11.  
  12.  
  13. DATA DIVISION.
  14. FILE SECTION.
  15. FD WORK-FILE.
  16. 01 OUT-FILE-REC PIC 9(5).
  17.  
  18.  
  19. WORKING-STORAGE SECTION.
  20. 01 LINE-COUNT PIC 9(5) VALUE 6.
  21.  
  22. PROCEDURE DIVISION.
  23.  
  24. *>------------------------------
  25. *> ファイルの書き込み
  26. *>------------------------------
  27.  
  28.  
  29. OPEN EXTEND WORK-FILE.
  30.  
  31.  
  32. PERFORM 5 TIMES
  33. ADD 1 TO LINE-COUNT
  34.  
  35. MOVE LINE-COUNT TO OUT-FILE-REC
  36.  
  37. WRITE OUT-FILE-REC
  38.  
  39. END-PERFORM.
  40.  
  41.  
  42. CLOSE WORK-FILE.
  43.  
  44.  
  45. STOP RUN.

sharing.sh:

   
  1. #!/bin/sh
  2. for i in `seq 10`
  3. do
  4.  
  5. ./sharing02-2
  6. sleep 1
  7. echo $i
  8.  
  9. done

実行結果:

辞典・辞書-SHARING-実行結果

紹介したサンプルの確認手順として、sharing02-2を1秒間隔で10回繰り返すシェルスクリプトであるsharing.shを実行し、シェルスクリプト実行中にsharing02-1を実行します。sharing02-1は書き込み処理を1000000回繰り返すので、その間にsharing02-2の書き込み処理が入るとファイルの競合が発生して、SHARING句で指定した排他ロックがかかります。

その結果、実行結果のようにファイル共有の競合(STATUS = 61) のエラーが発生します。

この記事を読んだ人は、こちらの記事も読んでいます

【未経験者歓迎】COBOLプログラマー・システムエンジニアの募集

株式会社COBOLの求人・転職・募集情報を見る

COBOL入門のカテゴリー

取引企業様 募集中
COBOL技術者 募集
COBOL魂
読者採用
COBOL入門