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

//但是进程在 SQLExecDirect api 上挂起,因为该表“test”已经被另一个进程锁定。(挂在某种意义上,等待所有其他进程释放锁)

为什么会这样?那是因为我的 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 回答