0

あるアプリケーションからテーブルをロックして、データを挿入したいと考えていました。そして、私の要件は、そのテーブルが他のプロセスによって既にロックされている場合、特定の時間後にロックを試みる必要があるということです。

centOS マシンで unixODBC ドライバーを使用しており、データベースは postgresql です。odbc api を使用して非同期で SQL を実行する方法について調査しました。SQLSetStmtAttr API を使用して、SQL ステートメントを非同期的に実行できることがわかりました。しかし、うまくいきません。

これは私がコードを書いた方法です:

 ret =  SQLSetStmtAttr( stmt1,  SQL_ATTR_ASYNC_ENABLE,(SQLPOINTER) SQL_ASYNC_ENABLE_ON, 0);
// above statement returned success

 if((ret = SQLExecDirect(stmt1,"lock table test",SQL_NTS)) == SQL_STILL_EXECUTING)
  {
     printf("\nCanceling\n");
     ret = SQLCancel(stmt);
  }

//しかし、そのテーブル「test」は別のプロセスによってすでにロックされているため、SQLExecDirect API でプロセスがハングアップしています。(他のすべてのプロセスがロックを解除するのを待って、ハングアップします)

なぜそうなのですか?これは、私の unixODBC ドライバーが非同期実行をサポートしていないためです。その場合、SQLSetStmtAttr が成功を返すのはなぜですか?

どんな助けでも大歓迎です。前もって感謝します。

4

1 に答える 1

1

freeTDS ドライバーを使用していますか? あなたはunixODBCについて言及しましたが、それはドライバーマネージャーであり、ドライバー自体ではないと思います。

freeTDS ODBC ドライバー コードを見ていました。

SQLSetStmtAttr() は SQL_ASYNC_ENABLE_ON を設定するジョブを実行しますが、実際にこの属性を使用する関数は、ハードコードされた値 SQL_ASYNC_ENABLE_OFF を使用しているようです。

于 2012-04-13T13:19:25.000 に答える