odbc - 没有 1s 延迟的第二个 ODBC UPDATE 调用导致第一次不发生
问题描述
我在一个循环中调用了几个自定义 API 来更新 SQL 数据库中的表,我发现如果我立即执行第二个,第一个实际上并没有更改数据库。如果我在通话之间等待一秒钟,它就会起作用。
这两个调用最初仅在按下单个 UI 按钮后进行,因此这可能是第一次有人尝试如此快速地连续两次调用。我们有一个功能请求,但现在需要它。
硬编码的 sleep() 有助于跟踪问题,但考虑解决方案确实违背了原则。所以我想知道在 ODBC 中需要做什么来确保对表的先前操作已经完成,这样下一个操作就不会失败。但同样,我完全是 ODBC 菜鸟,所以我不熟悉它的 API 应该如何使用(当然,这段代码的作者在 6 个月前离开了公司)。
通过 API 代码层的跟踪,我发现
- 一切都以 Windows ODBC 调用结束。
- 单个连接的单个句柄(来自 SQLAllocHandle )用于所有调用。
- 有问题的查询大致是
UPDATE table_name SET ... BEGIN INSERT INTO table_name (...) VALUES (...); END
每个查询的调用顺序似乎是:
SQLCancel(); 检查(SQLPrepare());检查(SQLExecute());SQLCancel();
在哪里check()
:
if (code != SQL_SUCCESS && code != SQL_SUCCESS_WITH_INFO) {
exception();
}
我在这里看到的主要问题是警告将被完全忽略。但是我的菜鸟读到的东西是,如果查询在调用结束时仍在运行,它应该进入异常(),类似于 HYT00(超时过期),对吧?
我能想到的唯一另一件事是另一个线程可能在同一连接上调用此 API,并使用其 SQLCancel() 取消操作。我会去三重检查,但我很确定这不会发生。
解决方案
推荐阅读
- php - 第一次添加到购物车在 Woocommerce 中显示 0 件商品
- cordova - 使用电子科尔多瓦的 Ionic 3 构建应用程序不可用
- python - Spyder中的属性错误
- laravel-5.2 - 如何在 laravel 5.2 中生成 RTF 文件?
- typescript - 将常量导入 Vue 组件
- python - Can't Read the latest Messages from kafka topic
- svn - 访问 SVN 时出错:E175002:SSL 握手失败
- java - 为什么 log4j 不显示格式化的 XML 内容
- android - android中库Gradle的自定义存储库
- api - 哪些 JIRA API URL 可用于在仪表板中获取详细信息?(如:“待办事项”“进行中”)