あるアプリケーションからテーブルをロックして、データを挿入したいと考えていました。そして、私の要件は、そのテーブルが他のプロセスによって既にロックされている場合、特定の時間後にロックを試みる必要があるということです。
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 が成功を返すのはなぜですか?
どんな助けでも大歓迎です。前もって感謝します。