分散作業単位接続を確立するための関数

SQL_COORDINATED_TRANS が設定された属性 SQL_ATTR_CONNECTTYPE を指定して SQLSetEnvAttr() また は SQLSetConnectAttr() を呼び出すと、分散作業単位接続が確立されます。

整合分散トランザクションを使用する場合は、初期化ファイルで MULTICONTEXT=1 を 指定することはできません。 アプリケーションのユーザーは、 Db2 ODBC 初期化ファイルまたは SQLDriverConnect() 接続文字列に CONNECTTYPE=2 を指定することで、協調トランザクションを有効にすることができます。

アプリケーションで、同時接続と整合接続を混合使用することはできません。 最初の接続で指定した接続タイプによって、後続のすべての接続タイプが決まります。 接続がアクティブな間に、アプリケーションが接続タイプを変更しようと すると、SQLSetEnvAttr() および SQLSetConnectAttr() はエラーを戻します。 ある接続タイプを設定すると、すべての接続ハンドルを解放して、CONNECTTYPE キーワードの値 または SQL_ATTR_CONNECTTYPE 属性を変更するまでは、その接続タイプは持続します。

以下の例は、SQL_ATTR_CONNECTTYPE を SQL_COORDINATED_TRANS に設定し、分散環境内の2つのデータソースで調整されたトランザクションを実行するアプリケーションの例を示しています。
図1: 整合トランザクション用に 2 つのデータ・ソースに接続するアプリケーション
/* ... */
#define MAX_CONNECTIONS   2
int
DBconnect(SQLHENV henv,
          SQLHDBC * hdbc,
          char    * server);
int
main()
{
    SQLHENV         henv;
    SQLHDBC         hdbc[MAX_CONNECTIONS];
    SQLRETURN       rc;
    char *          svr[MAX_CONNECTIONS] =
                    {
                      "KARACHI"   ,
                      "DAMASCUS"
                    }
    /* Allocate an environment handle   */
    SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &henv);
    /* Before allocating any connection handles, set Environment wide
       Connect Attributes  */
    /* Set to CONNECT(type 2)*/
    rc = SQLSetEnvAttr(henv, SQL_CONNECTTYPE,
                       (SQLPOINTER) SQL_COORDINATED_TRANS, 0);
/* ... */
    /* Connect to first data source */
    /* Allocate a connection handle     */
    if (SQLAllocHandle(SQL_HANDLE_DBC, henv, &hdbc[0]) != SQL_SUCCESS) {
        printf(">---ERROR while allocating a connection handle-----\n");
        return (SQL_ERROR);
    }
    /* Connect to first data source (Type-II) */
    DBconnect (henv,
               &hdbc[0],
               svr[0]);
    /* Allocate a second connection handle     */
    if (SQLAllocHandle(SQL_HANDLE_DBC, henv, &hdbc[1]) != SQL_SUCCESS) {
        printf(">---ERROR while allocating a connection handle-----\n");
        return (SQL_ERROR);
    }
    /* Connect to second data source (Type-II) */
    DBconnect (henv,
               &hdbc[1],
               svr[1]);
    /*********   Start processing step  *************************/
    /* Allocate statement handle, execute statement, and so on  */
    /* Note that both connections participate in the disposition*/
    /* of the transaction. Note that a NULL connection handle   */
    /* is passed as all work is committed on all connections.   */
    /*********   End processing step  ***************************/
    (void)SQLEndTran(SQL_HANDLE_HENV, henv, SQL_COMMIT);
    /* Disconnect, free handles and exit */
}
/********************************************************************
**   Server is passed as a parameter. Note that USERID and PASSWORD**
**   are always NULL.                                              **
********************************************************************/
int
DBconnect(SQLHENV henv,
          SQLHDBC * hdbc,
          char    * server)
{
    SQLRETURN       rc;
    SQLCHAR         buffer[255];
    SQLSMALLINT     outlen;
    /* Allocate a connection handle     */    
    SQLAllocHandle(SQL_HANDLE_DBC, henv, hdbc);
    rc = SQLConnect(*hdbc, server, SQL_NTS, NULL, SQL_NTS, NULL, SQL_NTS);
    if (rc != SQL_SUCCESS) {
        printf(">--- Error while connecting to database: 
        return (SQL_ERROR);
    } else {
        printf(">Connected to 
        return (SQL_SUCCESS);
    }
}
/* ... */