我们拥有最初基于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驱动程序,它是行不通的。