FCXCWAIT
タスクが資源タイプFCXCWAITを待機している場合、現在、そのタスクがVSAM制御インターバルの排他制御を取得できない状態であることを意味します。他のタスクがすでに制御インターバルの共用制御または排他制御を取得しているため、タスクはその制御インターバルが解放されるのを待機して、一時停止状態になっています。
CICS/ESA 4.1およびCICS Transaction Server 1.1では、資源タイプFCXCWAITの排他制御の待機は、類似のFCIOWAITの待機がVSAMで発生するのとは異なり、CICS内で発生します。
システム内で排他制御の競合が頻繁に発生する場合は、アプリケーションが排他制御を長時間保持しないようにプログラム ロジックを変更することを検討してください。
この資源の待機は、非RLSモードでアクセスされるファイルに対してのみ発生します。
タスクがデッドロック状態になり、そのタスク自体または他のタスクが制御インターバルを解放するのを待機する場合がありますが、その可能性については次のセクションで検討します。
排他制御デッドロック
非RLSモードでは、何らかの回避策がとられていないかぎり、タスクが、それ自体が制御を取得しているVSAM制御インターバルの排他制御を待機する状態に陥ることがあります。これに対する回避策がとられていない場合、タスクはデッドロック状態になり、排他制御を解放することも再取得することもできなくなります。
同様に、タスクは、VSAM制御インターバルの排他制御または共用制御を保持している他のタスクがロックを解放するのを待機することがあります。最初のタスクが排他制御または共用制御を保持している資源の排他制御を2番めのタスクが待機している場合、両方のタスクがデッドロック状態になります。
ただし、CICSには排他制御のデッドロックを回避するための仕組みが組み込まれています。あるタスクが資源タイプFCXCWAITを待機し、それにより他のタスクが待機状態になり(そのタスク自体もしくは他のタスクが制御を取得するのを待機)、結果としてデッドロック状態が生じる場合、このタスクは、排他制御要求を行った時点でアベンドします(アベンド コードAFCFまたはAFCG)。
アベンド コードAFCFでアベンドした場合、そのタスクは、他のタスクが排他制御または共用制御を保持しているVSAM制御インターバルの排他制御を待機していたことを意味します。
アベンド コードAFCGでアベンドした場合、そのタスクは、それ自体が共用制御を保持しているVSAM制御インターバルの排他制御を待機していたことを意味します。
アベンド コードの詳細については、『CICS Messages and Codes』を参照してください。
この問題を解決するには、デッドロックの原因となっている可能性があるプログラムを特定する必要があります。それには、アベンドしたタスクに関連するプログラムがどれかを見つけ、エラーが発生しているものを探します。通常、表示機能や更新機能を継続的に実行しているプログラムが、エラーを起こしている可能性があります。該当タスクに関連するプログラムが特定できたら、次の「タスクが排他制御を待機してデッドロックになる理由」を参照してください。
タスクが排他制御を待機してデッドロックになる理由
タスクは、CIの共有制御を取得し、その共有制御を解放せずにその排他制御を取得しようとした場合にのみ、CIの排他制御を待機してデッドロック状態に陥ります。これは、非RLSモードでアクセスされるVSAM共用資源データセットに対してのみ発生します。
デッドロックが発生する条件としては、まずトランザクションがEXEC CICS STARTBRによりVSAM READ SEQUENTIAL要求を発行しなければなりません。これは、VSAMの「共用資源」の取得操作です。次に、この共用資源の取得操作を終了せずに、CIの排他制御を必要とする何らかのVSAM要求を発行しなければなりません。
以下のような操作が、CIの排他制御要求に該当します。
-
EXEC CICS READ UPDATEによりVSAM READ UPDATEを実行し、続けてEXEC CICS REWRITEを実行する。CIの排他制御は、最初の読み取り(READ)が完了するまで取得されませんが、読み取りが完了すると自動的に取得され、レコードの再書き込み(REWRITE)が行われるまで解放されません。
-
EXEC CICS WRITEによりVSAM WRITE DIRECTを実行する。
-
EXEC CICS WRITE MASSINSERTによりVSAM WRITE SEQUENTIALを実行する。
VSAMは、すでに共用制御モードで使用中のデータセットに対する排他制御要求を、内部の待ち行列に入れます。そして制御をCICSに戻しますが、排他制御を待機しているトランザクションは一時停止状態になります。
排他制御のデッドロックを引き起こすコード例
以下に、排他制御のデッドロックを引き起こすEXECコマンド シーケンス例を示します。
最初のコマンドによって、共用制御が取得されます。
EXEC CICS STARTBR
FILE(myfile)
RIDFLD(rid-area)
この場合、問題は発生しません。しかし、次のコマンドによって最初に共用制御が取得され、レコードがinput-areaに読み込まれます。続くコマンドで排他制御を取得しようとすると、その排他制御を取得しようとするタスクが同時にその取得を妨げるタスクにもなっているため、結果としてデッドロックが発生します。
EXEC CICS READ
FILE(myfile)
INTO(input-area)
RIDFLD(rid-area)
UPDATE
以下のコマンド シーケンスでは、デッドロックは発生しません。ここでは、トランザクションがCIの排他制御を取得しようとする前に表示を終了し、共用制御を解放しているためです。
最初のコマンドによって、共用制御が取得されます。
EXEC CICS STARTBR
FILE(myfile)
RIDFLD(rid-area)
次のコマンドによって、共用制御が解放されます。
EXEC CICS ENDBR
FILE(myfile)
次のコマンドでは、最初に共用制御が取得されます。次に、レコードがinput-areaに読み込まれてから、共用制御の代わりに排他制御が取得されています。
EXEC CICS READ
FILE(myfile)
INTO(input-area)
RIDFLD(rid-area)
UPDATE
これで、トランザクションが再開します。ファイル myfile に対する次のREWRITEまたはUNLOCKコマンドのあと、排他制御は解放されます。