z/OS DB2 などの SQL CLR 以外の環境では、通常、COBOL ストアド プロシージャでの SQL アクティビティを通じて呼び出し元アプリケーションからトランザクションをチェーンすることができます。例えば、COBOL クライアント アプリケーションから実行される次のシーケンスについて考えてみましょう。
EXEC SQL Insert 1 END-EXEC EXEC SQL Call COBOL stored procedure A END-EXEC EXEC SQL Insert 2 END-EXEC Cobol call to COBOL routine B EXEC SQL Commit END-EXEC EXEC SQL Insert 3 END-EXEC EXEC SQL Rollback END-EXEC EXEC SQL Insert 4 END-EXEC EXEC SQL Insert 5 END-EXEC EXEC SQL Commit END-EXEC
DBMS は、通常、レコード 1、2、4、5 を挿入します。
SQL CLR を使用する SQL Server では、アプリケーションが何らかのストアド プロシージャのフローを呼び出すと、チェーンされたトランザクションではなく入れ子になったトランザクションが形成されます。各トランザクションで実行された処理の内容にかかわらず、この入れ子になったトランザクションの最も外側のトランザクションが、含まれているすべてのトランザクションの作業をコミットするか、ロールバックするかを最終的に決定します。この例では、COBOL クライアント アプリケーションが入れ子になったトランザクションを開始し、COMMIT で終了しているため、5 つのレコードすべてが挿入されます。アプリケーションが COMMIT ではなく ROLLBACK で終了することもよくあり、その場合は 5 つのレコードはいずれも挿入されません。
この動作は、移行した SQL Server アプリケーションにシリアル トランザクション チェーンを模倣させる必要がある場合は、許容されません。
OpenESQL では、z/OS DB2 とまったく同じように常にチェーンされたトランザクションをコミットまたはロールバックすることはできませんが、この問題に対処するための SQLCLRTRANS コンパイラ指令オプションが用意されています。SQLCLRTRANS は、z/OS DB2 の動作をエミュレートし、MF__SAVEPOINT という SQL Server のセーブポイントを使用します。
このソリューションでは、SQLCLRTRANS コンパイラ指令オプションを使用して COBOL コードをコンパイルすると、OpenESQL によって自動的に次のコード調整が行われます。
ON ENTRY1 | EXEC SQL COMMIT | EXEC SQL ROLLBACK | ON EXIT2 | |
---|---|---|---|---|
クライアント アプリケーション (COBOL のみ) |
トランザクションの開始 セーブポイントの設定、MF_SAVEPOINT |
コミット セーブポイントの設定、MF_SAVEPOINT |
ロールバック セーブポイントの設定、MF_SAVEPOINT |
ロールバック 接続の解除 |
先頭 (呼び出し先) ストアド プロシージャ |
MF_SAVEPOINT のリセット |
MF_SAVEPOINT までのロールバック |
||
入れ子になったストアド プロシージャ |
MF_SAVEPOINT のリセット |
MF_SAVEPOINT までのロールバック |
||
1 つまり、クライアント アプリケーションによって接続が開かれます。 | ||||
2 戻る。つまり、クライアント アプリケーションによって接続が閉じられます。 |
ただし、AUTOCOMMIT 指令を使用してアプリケーションをコンパイルする場合、または COBOL アプリケーションでオートコミットを明示的にオンにする場合は、次の点を考慮してください。
必要なコード調整を行った後、必要に応じ、OpenESQL SQLCLRTRANS コンパイラ指令オプションを使用して COBOL アプリケーションおよびすべての COBOL ストアド プロシージャ コードをコンパイルします。
ストアド プロシージャを呼び出す COBOL 以外のアプリケーションの場合、コンパイルする前に、呼び出し元アプリケーション コードに対して次の確認および変更を行います。
必要に応じて、すべての COBOL 以外の呼び出し元アプリケーションをコンパイルします。その後、OpenESQL SQLCLRTRANS コンパイラ指令オプションを使用してすべての COBOL ストアド プロシージャ コードをコンパイルします。
EXEC SQL Call COBOL stored procedure A END-EXEC EXEC SQL Insert 1 END-EXEC EXEC SQL CALL COBOL stored procedure B END-EXEC EXEC SQL Commit END-EXEC EXEC SQL Insert 2 END-EXEC EXEC SQL Rollback END-EXEC EXEC SQL Insert 3 END-EXEC EXEC SQL Commit END-EXEC
また、COBOL ルーチンに変換せずに入れ子になったストアド プロシージャを維持するために SQL Server データに対する並行性が重要となるアプリケーションに、このソリューションは最適であることについても説明します。
このソリューションでは、SQLCLRTRANS コンパイラ指令オプションおよび必要に応じて SPCOMMITONRETURN 指令を使用して COBOL コードをコンパイルすると、OpenESQL によって自動的に次のコード調整が行われます。
ON ENTRY | EXEC SQL COMMIT | EXEC SQL ROLLBACK | ON EXIT (戻る) | |
---|---|---|---|---|
先頭 (呼び出し先) ストアド プロシージャ |
トランザクションの開始 セーブポイントの設定、MF_SAVEPOINT |
コミット MF_SAVEPOINT のリセット |
MF_SAVEPOINT までのロールバック コミット MF_SAVEPOINT のリセット |
MF_SAVEPOINT までのロールバック または コミット1 |
入れ子になったストアド プロシージャ |
MF_SAVEPOINT のリセット |
MF_SAVEPOINT までのロールバック |
||
呼び出し先 COBOL ルーチン |
コミット MF_SAVEPOINT のリセット |
MF_SAVEPOINT までのロールバック コミット MF_SAVEPOINT のリセット |
||
1 コンパイル時に SQL(SPCOMMITONRETURN) を指定した場合は、ストアド プロシージャから呼び出し元プログラムに戻るときにコミットが実行されます。SQL(SPCOMMITONRETURN) を指定しなかった場合は、OpenESQL によって設定された最後のセーブポイントまでロールバックが実行されます。 |
必要なコード調整をすべて行った後、OpenESQL SQLCLRTRANS コンパイラ指令オプションおよび必要に応じて SPCOMMITONRETURN 指令を使用して、COBOL アプリケーションおよびすべての COBOL ストアド プロシージャ コードをコンパイルします。
このソリューションでは、SQL CLR COBOL ストアド プロシージャを呼び出す COBOL 以外のアプリケーションは SQL CLR COBOL ストアド プロシージャの呼び出しを実行する前にオートコミット モードになっている必要があります。これを行うには、呼び出しの前に次の TSQL 文を挿入します。
SET IMPLICIT_TRANSACTIONS ON
呼び出しを実行した後にオートコミット モードをオフにする必要がある場合は、次の TSQL 文を挿入します。
SET IMPLICIT_TRANSACTIONS OFF
コードで SQL CLR COBOL ストアド プロシージャの呼び出しを複数実行する場合は、各呼び出しを実行する前にオートコミット モードをオンにする必要があります。
必要なコード調整をすべて行った後、OpenESQL SQLCLRTRANS コンパイラ指令オプションおよび必要に応じて SPCOMMITONRETURN 指令を使用して、アプリケーションおよびすべての COBOL ストアド プロシージャ コードをコンパイルします。
EXEC SQL Call COBOL stored procedure A END-EXEC EXEC SQL Insert 1 END-EXEC CALL COBOL routine B END-EXEC EXEC SQL Commit END-EXEC EXEC SQL Insert 2 END-EXEC EXEC SQL Rollback END-EXEC EXEC SQL Insert 3 END-EXEC EXEC SQL Commit END-EXEC
また、SQL Server データに対する並行性が最も重要となるアプリケーションにこのソリューションは最適であること、および先頭の COBOL ストアド プロシージャでアプリケーションのすべてのシリアル トランザクション チェーンを管理できることについても説明します。
このソリューションでは、SQLCLRTRANS コンパイラ指令オプションおよび必要に応じて SPCOMMITONRETURN 指令を使用して COBOL コードをコンパイルすると、OpenESQL によって自動的に次のコード調整が行われます。
ON ENTRY | EXEC SQL COMMIT | EXEC SQL ROLLBACK | ON EXIT (戻る) | |
---|---|---|---|---|
先頭 (呼び出し先) ストアド プロシージャ |
トランザクションの開始 セーブポイントの設定、MF_SAVEPOINT |
コミット MF_SAVEPOINT のリセット |
MF_SAVEPOINT までのロールバック コミット MF_SAVEPOINT のリセット |
MF_SAVEPOINT までのロールバック または コミット1 |
入れ子になったストアド プロシージャ |
MF_SAVEPOINT のリセット |
MF_SAVEPOINT までのロールバック |
||
呼び出し先 COBOL ルーチン |
コミット MF_SAVEPOINT のリセット |
MF_SAVEPOINT までのロールバック コミット MF_SAVEPOINT のリセット |
||
1 コンパイル時に SQL(SPCOMMITONRETURN) を指定した場合は、ストアド プロシージャから呼び出し元プログラムに戻るときにコミットが実行されます。SQL(SPCOMMITONRETURN) を指定しなかった場合は、OpenESQL によって設定された最後のセーブポイントまでロールバックが実行されます。 |
必要なコード調整をすべて行った後、OpenESQL SQLCLRTRANS コンパイラ指令オプションおよび必要に応じて SPCOMMITONRETURN 指令を使用して、COBOL アプリケーションおよびすべての COBOL ストアド プロシージャ コードをコンパイルします。これにより、ストアド プロシージャから呼び出し元アプリケーションに戻るときに、ストアド プロシージャによって実行された作業が自動的にコミットされます。SPCOMMITONRETURN を指定しなかった場合は、ストアド プロシージャの代わりに、OpenESQL によって、実行された最後のコミットまでロールバックされます。
SET IMPLICIT_TRANSACTIONS ON
呼び出しを実行した後にオートコミット モードをオフにする必要がある場合は、次の TSQL 文を挿入します。
SET IMPLICIT_TRANSACTIONS OFF
コードで SQL CLR COBOL ストアド プロシージャの呼び出しを複数実行する場合は、各呼び出しを実行する前にオートコミット モードをオンにする必要があります。
必要なコード調整をすべて行った後、OpenESQL SQLCLRTRANS コンパイラ指令オプションおよび必要に応じて SPCOMMITONRETURN 指令を使用して、すべての COBOL ストアド プロシージャ コードをコンパイルします。SPCOMMITONRETURN を指定すると、ストアド プロシージャから呼び出し元アプリケーションに戻るときに、ストアド プロシージャによって実行された作業が自動的にコミットされます。SPCOMMITONRETURN を指定しなかった場合は、ストアド プロシージャの代わりに、OpenESQL によって、実行された最後のコミットまでロールバックされます。