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

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

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

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

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

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

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

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

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

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

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

由于数据源的行为,步骤 5 中 对 SQLEndTran 的调用会导致关闭语句 1 和 2 上的游标,并删除所有语句的访问计划。 应用程序必须重新execute 语句 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