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;
}