MSSQL Linux ODBC:使用SQLCancel()支持查询中断

时间:2019-07-19 16:14:04

标签: sql-server linux odbc

我们拥有最初基于Windows ODBC的C ++代码,可与MSSQL2017进行通信。如果我们认为运行时间过长,我们可以使用SQLCancel()API取消由SQLExecute函数运行的某些查询。

这样的代码

线程A:SQLExecute()
线程B:如果认为线程A查询过长,或者管理员手动希望停止查询。它将调用SQLCancel()来取消该查询。对于线程A,该SQLExecute()函数将按预期返回以下错误。

  

ODBC错误。 SQLSTATE:HY008本机错误:0   消息:[Microsoft] [ODBC SQL Server驱动程序]操作已取消

请注意,我们将Sync连接用于任何ODBC操作。

将代码移至Linux平台时,我们使用最新的MSSQL Linux ODBC驱动程序17.3。对于相同的情况,

线程A运行SQLExectue()

线程B调用SQLCancel()

我可以看到SQLCancel()函数成功返回,但是线程A的SQLExectue()将不会返回并保持挂起状态。所以我需要手动Ctrl + C来停止应用程序。从系统日志中,我可以看到

  

[0]在UGS :: Error :: Exception :: doTraceback(bool)附近的7efcf80ba8e7   const + 0x74(libsyss.so)

     

[1] 7efcf80dd83a附近   UGS :: Error :: Signal :: Signal(char const *,int,int,char const *,__va_list_tag *)+ 0x3f(libsyss.so)

     

[2]在UGS :: Error :: Signal :: raise附近的7efcf80dd870(char const *,int,int,char const *,__ va_list_tag *)+ 0x19(libsyss.so)

     

[3]在UGS :: Error :: Signal :: raise附近的7efcf80dd919(char const *,int,int,char const *,...)+ 0x7c(libsyss.so)

     

[4] general_fault_handler(int)+ 0x145(libsyss.so)附近的7efcf809b2dd

     

[5] 7efcf2bae950>(libc.so.6)

         -- signal -- 
     

[6] __libc_recv + 0x1a(libpthread.so.0)附近的7efcf37c9fbb

     

[7] 7efceed38402(libmsodbcsql-17.3.so.1.1)

     

[8] 7efceedbe3fe(libmsodbcsql-17.3.so.1.1)

...

  

[18] 7efcf4010c29在SQLExecute + 0x1e8附近
  (libodbc.so.2)

线程A,挂在SQLExecute()周围,甚至从不返回,即使线程B已经取消了该查询。我检查了在线文档,它说要取消查询,您的连接需要是异步的,但是我的问题是,为什么Windows ODBC驱动程序支持取消查询,即使它是同步连接也是如此,但是对于Linux ODBC驱动程序,它是行不通的。

0 个答案:

没有答案