我如何使用 Windows ODBC 执行手动事务
How do i perform manual transactions with Windows ODBC
如何使用 Microsoft Windows ODBC API 手动使用 commited/rolled 后台事务?如果重要的话,查询的 SQL 服务器是 MS SQL 服务器。语言是 C++。
我需要将对 SQLExecDirect
的多次调用包含在单个事务中以保证一致性。执行的查询不使用任何事务。
伪代码:
// Begin Transaction?
SQLExecDirect(...);
SQLExecDirect(...);
SQLExecDirect(...);
SQLExecDirect(...);
SQLExecDirect(...);
SQLEndTran(...);
我的方法是首先禁用自动提交,如 TechNet 中所述:
SQLSetConnectAttr(m_hConnection, SQL_ATTR_AUTOCOMMIT, (void*) SQL_AUTOCOMMIT_OFF, 0);
运行 我的查询,然后是 commit/rollback:
SQLEndTran(SQL_HANDLE_DBC, m_hConnection, SQL_COMMIT);
它没有给出任何错误,但似乎并不能解决问题。如果我使用 MS SQL Management Studio 检查事务日志,所有内容都显示为 implicit_transaction
(好的),仅跨越一个操作(不好)。
这个问题可能是由每次调用 SQLExecDirect
使用自己的语句句柄引起的吗?我正在考虑这一点,我可以尝试改变它,但这将是一项我不愿意做的任务,因为它 可能 是。
另一方面,我不知道如何进一步调试。如果有人有任何想法,我将不胜感激。
这和我平时做的非常相似。 SQLSetConnectAttr 中的一些差异:
- 我检查return值
- SQL_AUTOCOMMIT_OFF 应转换为 SQLPOINTER
- 最后一个参数应该是 SQL_IS_UINTEGER 而不是 0
我觉得其他一切都还好...
如何使用 Microsoft Windows ODBC API 手动使用 commited/rolled 后台事务?如果重要的话,查询的 SQL 服务器是 MS SQL 服务器。语言是 C++。
我需要将对 SQLExecDirect
的多次调用包含在单个事务中以保证一致性。执行的查询不使用任何事务。
伪代码:
// Begin Transaction?
SQLExecDirect(...);
SQLExecDirect(...);
SQLExecDirect(...);
SQLExecDirect(...);
SQLExecDirect(...);
SQLEndTran(...);
我的方法是首先禁用自动提交,如 TechNet 中所述:
SQLSetConnectAttr(m_hConnection, SQL_ATTR_AUTOCOMMIT, (void*) SQL_AUTOCOMMIT_OFF, 0);
运行 我的查询,然后是 commit/rollback:
SQLEndTran(SQL_HANDLE_DBC, m_hConnection, SQL_COMMIT);
它没有给出任何错误,但似乎并不能解决问题。如果我使用 MS SQL Management Studio 检查事务日志,所有内容都显示为 implicit_transaction
(好的),仅跨越一个操作(不好)。
这个问题可能是由每次调用 SQLExecDirect
使用自己的语句句柄引起的吗?我正在考虑这一点,我可以尝试改变它,但这将是一项我不愿意做的任务,因为它 可能 是。
另一方面,我不知道如何进一步调试。如果有人有任何想法,我将不胜感激。
这和我平时做的非常相似。 SQLSetConnectAttr 中的一些差异:
- 我检查return值
- SQL_AUTOCOMMIT_OFF 应转换为 SQLPOINTER
- 最后一个参数应该是 SQL_IS_UINTEGER 而不是 0
我觉得其他一切都还好...