4.6.3 SQL Serverとの連携
ここでは,SQL Serverと連携するために必要な設定について説明します。
- 〈この項の構成〉
(1) SQL Serverの登録
OpenTP1システムにSQL Serverを登録します。OpenTP1システムへのSQL Serverの登録には,trnlnkrmコマンドを使用します。
trnlnkrmコマンドの実行例を次に示します。
trnlnkrm -a MS_SQL_Server -s msqlsrvxa1 -o xaswitch.lib
trnlnkrmコマンドについては,「7. 運用コマンド」を参照してください。また,trnlnkrmコマンドに指定する「RM名」にはMS_SQL_Serverを指定してください。
「RMスイッチ名」,「RM関連オブジェクト名」については,SQL Serverのマニュアルを参照してください。
trnlnkrmコマンドを実行する場合の注意事項を次に示します。
-
trnlnkrmコマンドの-oオプションの指定について
事前に,環境変数LIBに関連オブジェクトのパスを設定しておいてください。また,関連オブジェクト名称をフォルダ付きの絶対パスで指定する場合は,フォルダの区切り文字は「\\」としてください。
-
prcsvpath定義コマンドの指定について
OpenTP1システムにSQL Serverを登録すると,トランザクションサービスプロセスがSQL Serverのランタイムライブラリを使用します。このため,プロセスサービス定義のprcsvpath定義コマンドで,SQL Serverのランタイムライブラリの格納フォルダを指定してください。prcsvpath定義コマンドの定義例を次に示します。
prcsvpath c:\mssql\binn
(2) トランザクションサービス定義の設定
トランザクションサービス定義のtrnstring定義コマンドで,リソースマネジャにアクセスするための情報を指定します。SQL Serverと連携する場合は,-nオプション,-oオプション,-Oオプション,-cオプション,-Cオプション,-および必要に応じて-dオプションを指定します。
-oオプション,-Oオプション,-cオプション,および-Cオプションには,リソースマネジャへのアクセスに使用するxa_open関数用文字列,およびxa_close関数用文字列を指定します。xa_open関数用文字列,およびxa_close関数用文字は次のように指定してください。
-
-oオプション,-Oオプション,-cオプション,および-Cオプションには,すべて同じ値を指定します。
-
RmRecoveryGuidには,グローバルで一意な値を指定します。WindowsのguidgenユーティリティプログラムのRegistry Formatで取得した値(括弧は省く)を指定します。
-
Timeoutには,XAトランザクションのタイムアウト値をミリ秒で指定します。指定したタイムアウト時間が経過すると,SQL Server(WindowsのMSDTC)はXAトランザクションを自動的にロールバックします。
SQL Serverのxa_open関数用文字列,およびxa_close関数用文字列として指定する内容の詳細については,SQL Serverのマニュアルを参照してください。
トランザクションサービス定義の定義例を次に示します。
set trn_extend_function=00000001 #add when SQL Server is used. trnstring -n MS_SQL_Server \ -o "Tm=OpenTP1,\ RmRecoveryGuid=986D495E-F4D4-4e80-8B70-9377FFAF33E7,Timeout=180000" \ -O "Tm=OpenTP1,\ RmRecoveryGuid=986D495E-F4D4-4e80-8B70-9377FFAF33E7,Timeout=180000" \ -c "Tm=OpenTP1,\ RmRecoveryGuid=986D495E-F4D4-4e80-8B70-9377FFAF33E7,Timeout=180000" \ -C "Tm=OpenTP1,\ RmRecoveryGuid=986D495E-F4D4-4e80-8B70-9377FFAF33E7,Timeout=180000"
- 注
-
""で囲んだ文字列を継続行記号(\)で区切って改行する場合は,次の行は必ず第1カラム目から記述し,スペースを開けないで文字列を続けてください。
- 注意事項
-
X/OpenのXAインタフェースを使用してOpenTP1からSQL Serverにアクセスする場合に発生する障害の多くは,xa_open関数用文字列,およびxa_close関数用文字列の定義誤りによって発生します。KFCA00901-Wメッセージが出力された場合には,xa_open関数用文字列,およびxa_close関数用文字列の定義を見直してください。
(3) UAPの翻訳と結合
SQL ServerにアクセスするUAPを翻訳(コンパイル)および結合(リンケージ)する場合,trnmkobjコマンドで%DCDIR%\spool\trnrmcmd\userobj下に作成したトランザクション制御用オブジェクトをリンケージする必要があります。
コンパイルとリンケージの手順については,「3.2 UAPの翻訳と結合」を参照してください。各言語に関するコンパイルとリンケージのオプションについては,マニュアル「OpenTP1 プログラム作成リファレンス C言語編」および「OpenTP1 プログラム作成リファレンス COBOL言語編」を参照してください。その他のコンパイルとリンケージのオプションについては,MicrosoftまたはSQL Serverのマニュアルを参照してください。
trnmkobjコマンドについては,「7. 運用コマンド」を参照してください。
SQL ServerにアクセスするUAP用トランザクション制御用オブジェクトの作成例を,C言語の場合とCOBOL言語の場合に分けて次に示します。
C言語の場合
trnmkobj -o rm_obj -r MS_SQL_Server
COBOL言語の場合
trnmkobj -o rm_obj -C "/Zl" -r MS_SQL_Server
(4) メイクファイルの例(C言語の場合)
C言語でSPPを作成する場合のメイクファイルの例を示します。
(a) ソースファイル名
メイクファイルの例中で使用するソースファイル名を次に示します。
-
C言語で作成したUAPのソースプログラム名:
-
exmain.c(メイン関数)
-
exsv1.c(サービス関数1)
-
exsv2.c(サービス関数2)
-
exsql.c(SQL)
-
-
RPCインタフェース定義ファイル名:ex.def
(b) メイクファイルの例
メイクファイルの例を次に示します。
NODEBUG = 1 !include <ntwin32.mak> #TP1TEST Make File SYSLIB = $(conlibsdll) TP1LIB = [libdam.lib]※1 [libtam.lib]※2 libbetran.lib SQLSRVLIB = xaswitch.lib odbc32.lib all:TP1TEST.exe #コンパイル exmain.obj:exmain.c $(cc) $(cflags) $(cvarsdll) $*.c exsv1.obj:exsv1.c $(cc) $(cflags) $(cvarsdll) $*.c exsv2.obj:exsv2.c $(cc) $(cflags) $(cvarsdll) $*.c ex_sstb.obj:ex_sstb.c $(cc) $(cflags) $(cvarsdll) $*.c exsql.obj:exsql.c $(cc) $(cflags) $(cvarsdll) $*.c #スタブソースファイルの作成 ex_sstb.c:ex.def $(DCDIR)\bin\stbmake $? #リンケージ TP1TEST.exe: exmain.obj exsv1.obj exsv2.obj ex_sstb.obj exsql.obj $(link) $(conflags) -out:$*.exe $** \ [$(DCDIR)\spool\trnrmcmd\userobj\rm_obj.obj \]※3 $(TP1LIB) $(SYSLIB) $(SQLSRVLIB)
- 注※1
-
libdam.libは,TP1/FS/Direct Accessを使用する場合だけ指定してください。
- 注※2
-
libtam.libは,TP1/FS/Table Accessを使用する場合だけ指定してください。
- 注※3
-
TP1/FS/Direct AccessまたはTP1/FS/Table Accessを使用する場合には,trnmkobjコマンドでトランザクション制御用オブジェクトを作成するときに,「OpenTP1_DAM」または「OpenTP1_TAM」を追加してください。
(5) メイクファイルの例(COBOL言語の場合)
COBOL言語でSPPを作成する場合のメイクファイルの例を示します。
(a) ソースファイル名
メイクファイルの例中で使用するソースファイル名を次に示します。
-
COBOL2002で作成したUAPのソースプログラム名:main.cbl
-
COBOL2002で作成したUAPのサービスプログラム名:sev1.cbl
-
COBOL2002で作成したUAPのサービスプログラム名:sev2.cbl
-
COBOL2002で作成したSQLプログラム名1:exsql1.cbl
-
COBOL2002で作成したSQLプログラム名2:exsql2.cbl
-
RPCインタフェース定義ファイル名:ex.def
(b) メイクファイルの例
メイクファイルの例を次に示します。
!include <ntwin32.mak> # TP1TEST Make File CBLFG1 = -Compile,NoLink -Comp5 -Lib,CUI -SQL,ODBC -Main,System CBLFG2 = -Compile,NoLink -Comp5 -Lib,CUI -SQL,ODBC SYSLIB = $(conlibsdll) TP1LIB = [libdam.lib]※1 [libtam.lib]※2 libbetran.lib SQLSRVOBJ = xaswitch.lib CCBL = ccbl2002 LK = ccbl2002 -Lib,CUI all:TP1TEST.exe # コンパイル main.obj:main.cbl $(CCBL) $(CBLFG1) main.cbl sev1.obj:sev1.cbl $(CCBL) $(CBLFG2) sev1.cbl sev2.obj:sev2.cbl $(CCBL) $(CBLFG2) sev2.cbl exsql1.obj:exsql1.cbl $(CCBL) $(CBLFG2) exsql1.cbl exsql2.obj:exsql2.cbl $(CCBL) $(CBLFG2) exsql2.cbl ex_sstb.obj:ex_sstb.c $(cc) $(cflags) /Zl $(cvarsdll) $*.c # スタブソースファイルの作成 ex_sstb.c:ex.def $(DCDIR)\bin\stbmake $? # リンケージ TP1TEST.exe: main.obj sev1.obj sev2.obj ex_sstb.obj \ exsql1.obj exsql2.obj $(LK) -OutputFile $*.exe $** \ [$(DCDIR)\spool\trnrmcmd\userobj\rm_obj.obj \]※3 $(TP1LIB) $(SYSLIB) $(SQLSRVOBJ)
- 注※1
-
libdam.libは,TP1/FS/Direct Accessを使用する場合だけ指定してください。
- 注※2
-
libtam.libは,TP1/FS/Table Accessを使用する場合だけ指定してください。
- 注※3
-
TP1/FS/Direct AccessまたはTP1/FS/Table Accessを使用する場合には,trnmkobjコマンドでトランザクション制御用オブジェクトを作成するときに,「OpenTP1_DAM」または「OpenTP1_TAM」を追加してください。
(6) SQL Serverとの連携時の注意事項
-
OpenTP1とSQL ServerをX/OpenのXAインタフェースで連携する場合,SQL Serverの関連サービスがすべて起動されていることを確認してください。
-
OpenTP1とSQL ServerをX/OpenのXAインタフェースで連携する場合,トランザクションの開始,および同期点取得は,次に示すOpenTP1の関数を使用してください。
dc_trn_begin,tx_begin,dc_trn_unchained_commit,dc_trn_chained_commit,tx_commit,dc_trn_unchained_rollback,dc_trn_chained_rollback,tx_rollback
SQL ServerのSQL言語などでコミットやロールバックをした場合,またはSQL ServerがXAインタフェースで連携する場合に使用できない機能を使用すると,トランザクション処理が正常に実行されないで,リソース間の不整合が発生したり,OpenTP1システムがダウンしたりすることがあります。
-
OpenTP1とSQL ServerをX/OpenのXAインタフェースで連携する場合のUAP作成時の注意事項を次に示します。
-
ODBC接続によってXAインタフェースでの連携をする場合(UAPをC言語またはC++言語で作成)
OpenTP1のトランザクションとSQL Serverとの接続をXAインタフェースで関連づけるために,各トランザクションブランチの先頭で関連づけを行う関数(SQLSetconnectOption)を発行する必要があります。この関数が発行されていないと,OpenTP1で管理しているトランザクションによる決着ができません。詳細については,SQL Serverのマニュアルを参照してください。
-
ODBC接続によってXAインタフェースでの連携をする場合(UAPをCOBOL2002で作成)
OpenTP1のトランザクションとSQL Serverとの接続をXAインタフェースで関連づけるために,各トランザクションブランチの先頭で関連づけを行うサービスルーチン(COBOL2002が提供するCBLSQLSETOPT)を発行する必要があります。このサービスルーチンが発行されていないと,OpenTP1で管理しているトランザクションによる決着ができません。また,次の環境変数をSQL ServerとXAインタフェースで連携するユーザサーバのユーザサービス定義に指定してください。
putenv CBLSQLCOMMOD AUTO
-
-
OpenTP1とSQL ServerをX/OpenのXAインタフェースで連携する場合,連鎖型RPCの使用には注意してください。OpenTP1のトランザクションとSQL Serverとの接続をXAインタフェースで関連づける三つの関数(dbenlistxatrans,SQLSetconnectOption,CBLSQLSETOPT)を2回目以降のRPCで発行しないようにする必要があります。
-
OpenTP1とSQL ServerをX/OpenのXAインタフェースで連携する場合,XAインタフェースのオープン文字列,クローズ文字列にTimeoutの設定を行ってください。Timeoutの設定を行わないと,UAPが異常終了した場合にSQL Server(WindowsのMSDTC)内で「SPID=-2」という状態のトランザクションが残り続けることがあります。
-
OpenTP1とSQL ServerをX/OpenのXAインタフェースで連携する場合,トランザクションブランチが関連するすべてのOpenTP1ノードで,トランザクションサービス定義に次の設定をしてください。
set trn_extend_function=00000001
なお,次に示す条件が重なった場合,OpenTP1のトランザクション決着関数は,「DC_OK(0)」ではなく「DCTRNER_HAZARD(-904)」または「TX_HAZARD(-4)」を返すようになります。
-
リソースマネジャへのアクセスがSQL Serverしか存在しない(1相コミットで決着を行う)
-
Timeoutの指定によってSQL Serverがトランザクションを自動的にロールバックする
-