RETURNサービス・トランザクションのステータスの確認
RETURNサービスのステータスを確認することや、最後に返されたステータスがどれであったかを確認することができます。
RETURNサービスが無効になっているかどうかの確認
特定のサブスクライバに対するRETURNサービスがDISABLE RETURN
障害ポリシーによって無効にされているかどうかを確認するには、ttRepSyncSubscriberStatus
組込みプロシージャをコールします。
ttRepSyncSubscriberStatus
組込みプロシージャで返される値が1の場合は、RETURNサービスがサブスクライバに対して無効になっていることを示し、0(ゼロ)の場合は、RETURNサービスが有効であることを示します。
この例では、ttRepSyncSubscriberStatus
を使用して、マスター・データベースmasterDSN
に関するsubscriberds
データベースのRETURN RECEIPTステータスを取得します。
> ttIsql masterDSN Command> CALL ttRepSyncSubscriberStatus ('subscriberds'); < 0 > 1 row found.
この結果は、RETURNサービスが有効であることを示しています。
「RETURNサービス・ブロッキングの手動による無効化」を参照してください。
RETURNサービスについての最後に返されたステータスの確認
接続ハンドルで最後に実行されたRETURN RECEIPTトランザクションまたはRETURN TWOSAFEトランザクションのステータスは、ttRepXactTokenGet
およびttRepXactStatus
組込みプロシージャをコールすることによって確認できます。
まず、ttRepXactTokenGet
組込みプロシージャをコールして、最後のRETURNサービス・トランザクションの固有トークンを取得します。RETURN RECEIPTを使用している場合は、マスター・データベースで最後にコミットされたRETURN RECEIPTトランザクションがトークンによって識別されます。RETURN TWOSAFEを使用している場合は、サブスクライバでのコミットが成功した場合に、マスターのレプリケーション・エージェントによってコミットされる、マスター上の最後のRETURN TWOSAFEトランザクションがトークンによって識別されます。ただし、タイムアウトなどのエラーが発生した場合、トークンによって識別されたTWOSAFEトランザクションはマスターのレプリケーション・エージェントによってはコミットされません。
次に、ttRepXactTokenGet
によって返されたトークンをttRepXactStatus
組込みプロシージャに渡して、RETURNサービスのステータスを取得します。ttRepXactStatus
組込みプロシージャの出力は、レプリケート・データを受信するように構成されているサブスクライバ、および各サブスクライバに対してトランザクションの現在のステータス(未送信、受信済、コミット済)をレポートします。サブスクライバ・レプリケーション・エージェントがサブスクライバ・データベースへのトランザクションの適用時に問題を検出した場合、ttRepXactStatus
組込みプロシージャにはエラー文字列も含まれます。RETURN TWOSAFEの使用時にタイムアウトなどのエラーを受信した場合は、無条件にコミットするか、コミットを再試行するかを決定できます。これについては、「RETURNサービスの使用」で説明されています。
ノート:
ttRepXactTokenGet
で取得したトークンを使用せずにttRepXactStatus
をコールすると、接続上でRETURN RECEIPTまたはRETURN TWOSAFEレプリケーション・サービスによって最後にコミットされたトランザクションの状態が返されます。
ttRepXactStatus
組込みプロシージャは、各サブスクライバのRETURNサービスのステータスを、次のように書式設定された行セットとして返します。
subscriberName, status, error
GetRSXactStatus
関数でttRepXactTokenGet
およびttRepXactStatus
組込みプロシージャをコールすると、レプリケート・システムの各サブスクライバのステータスをレポートできます。
SQLRETURN GetRSXactStatus (HDBC hdbc) { SQLRETURN rc = SQL_SUCCESS; HSTMT hstmt = SQL_NULL_HSTMT; char xactId [4001] = ""; char subscriber [62] = ""; char state [3] = ""; /* get the last RS xact id processed on this connection */ SQLAllocStmt (hdbc, &hstmt); SQLExecDirect (hstmt, "CALL ttRepXactTokenGet ('R2')", SQL_NTS); /* bind the xact id result as a null terminated hex string */ SQLBindCol (hstmt, 1, SQL_C_CHAR, (SQLPOINTER) xactId, sizeof (xactId), NULL); /* fetch the first and only row */ rc = SQLFetch (hstmt); /* close the cursor */ SQLFreeStmt (hstmt, SQL_CLOSE); if (rc != SQL_ERROR && rc != SQL_NO_DATA_FOUND) { /* display the xact id */ printf ("\nRS Xact ID: 0x%s\n\n", xactId); /* get the status of this xact id for every subscriber */ SQLBindParameter (hstmt, 1, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_VARBINARY, 0, 0, (SQLPOINTER) xactId, strlen (xactId), NULL); /* run */ SQLExecDirect (hstmt, "CALL ttRepXactStatus (?)", SQL_NTS); /* bind the result columns */ SQLBindCol (hstmt, 1, SQL_C_CHAR, (SQLPOINTER) subscriber, sizeof (subscriber), NULL); SQLBindCol (hstmt, 2, SQL_C_CHAR, (SQLPOINTER) state, sizeof (state), NULL); /* fetch the first row */ rc = SQLFetch (hstmt); while (rc != SQL_ERROR && rc != SQL_NO_DATA_FOUND) { /* report the status of this subscriber */ printf ("\n\nSubscriber: %s", subscriber); printf ("\nState: %s", state); /* are there more rows to fetch? */ rc = SQLFetch (hstmt); } } /* close the statement */ SQLFreeStmt (hstmt, SQL_DROP); return rc; }