Асинхронное выполнение SQL с использованием API UnixODBC терпит неудачу - PullRequest
0 голосов
/ 06 марта 2012

Я хотел заблокировать таблицу из одного приложения и вставить некоторые данные.И мое требование заключается в том, что если эта таблица уже заблокирована каким-либо другим процессом, то мне нужно попытаться заблокировать ее через определенное время.

Я использую драйвер unixODBC на машине CentOS, и моя база данных - postgresql.Я провел исследование о том, как выполнить SQL асинхронно с помощью API ODBC.Я обнаружил, что 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);
  }

// Но процесс зависает на API SQLExecDirect, так как эта таблица "test" уже заблокирована другимпроцесс.(Зависание в том смысле, что все другие процессы снимают блокировку)

Почему так?Это потому, что мой драйвер unixODBC не поддерживает асинхронное выполнение.если так, то почему SQLSetStmtAttr возвращает успех?

Любая помощь очень ценится.Заранее спасибо.

1 Ответ

1 голос
/ 13 апреля 2012

Вы используете драйвер freeTDS? Вы упомянули unixODBC, я думаю, что это диспетчер драйверов, а не сам драйвер.

Я искал код драйвера ODBC freeTDS.

Похоже, что хотя SQLSetStmtAttr () выполняет настройку SQL_ASYNC_ENABLE_ON, функции, которые фактически используют этот атрибут, используют жестко закодированное значение SQL_ASYNC_ENABLE_OFF.

...