对游标和已准备语句的事务影响

提交或回滚事务对游标和访问计划具有以下影响之一:

  • 关闭所有游标,并删除针对该连接的已准备语句的访问计划,或者

  • 所有游标均已关闭,并且针对该连接的已准备语句的访问计划保持不变,或者

  • 所有游标均保持打开,并且针对该连接的已准备语句的访问计划保持不变。

例如,假设数据源显示此列表中的第一个行为,即这些行为中最严格的行为。 现在,假设应用程序执行以下操作项:

  1. 将提交模式设置为手动提交。

  2. 在语句 1 上创建销售订单的结果集。

  3. 当用户突出显示该订单时,在语句 2 上创建销售订单中的行的结果集。

  4. 调用 SQLExecute 以在用户更新行时执行已在语句 3 上准备好的定位更新语句。

  5. 调用 SQLEndTran 以提交定位的 update 语句。

由于数据源的行为,在步骤 5 中调用 SQLEndTran 会导致它关闭语句 1 和 2 上的游标,并删除所有语句的访问计划。 应用程序必须重新执行 语句 1 和 2 才能重新创建结果集,并在语句 3 上重新准备语句。

在自动提交模式下,除了 SQLEndTran 之外的函数将提交事务:

  • SQLExecuteSQLExecDirect在前面的示例中,在步骤 4 中调用 SQLExecute 将提交事务。 这会导致数据源关闭语句 1 和 2 的游标,并删除此连接上所有语句的访问计划。

  • SQLBulkOperationsSQLSetPos在前面的示例中,假设在步骤 4 中,应用程序使用语句 2 上的 SQL_UPDATE 选项调用 SQLSetPos,而不是在语句 3 上执行定位更新语句。 该操作将会提交事务,并导致数据源关闭语句 1 和 2 上的游标,并放弃该连接上的所有访问计划。

  • SQLCloseCursor在前面的示例中,假设当用户突出显示其他销售订单时,应用程序会在为新销售订单创建行结果之前对语句 2 调用 SQLCloseCursor。 对 SQLCloseCursor 调用将提交创建了行的结果集的 SELECT 语句,并导致数据源关闭语句 1 上的游标,然后放弃该连接上的所有访问计划。

用户在其中滚动浏览结果集并更新或删除行的应用程序(尤其是基于屏幕的应用程序)必须小心地对此行为进行编码。

要确定数据源在提交或回滚事务时的行为方式,应用程序使用 SQL_CURSOR_COMMIT_BEHAVIOR 和 SQL_CURSOR_ROLLBACK_BEHAVIOR 选项调用 SQLGetInfo