当过程调用时,何时提交会影响实际表



我正在与struts框架的ms sql工作。在调用过程时,我在程序中设置了自动提交错误。当过程运行时,我必须提交一个单独的事务,它必须从外部影响表但它永远不会被保存,直到conn.commit()语句在程序中执行。在过程本身中提交事务,以影响过程中单个事务结束时的表,还有其他方法吗?如果你知道,请告诉我。

T。萨拉瓦南

您应该在同一级别启动和提交/回滚事务,否则您将引入许多不可预测的路径-坦率地说,这是一些糟糕的设计。因此:如果您需要在服务器上提交,请在TSQL中使用BEGIN TRAN/COMMIT TRAN来本地处理事务。

请注意,TSQL异常/错误处理并不像java/c#这样的调用者处理错误那样丰富。如果问题是要将此工作与另一个不相关的事务分离,则取决于调用代码的工作方式:

  • 如果使用连接级事务,则需要使用单独的连接;只需使用java/c#/任何事务API在不同的连接上运行事务(即与您现有的代码相同,通过它的声音,但在不同的连接上)
  • ,如果它正在使用诸如基于作用域的事务(TransactionScope在c#;不确定java等-但这是一个LTM或DTC事务),那么你可以显式地创建一个新的作用域,绑定到一个新的(隔离)事务,或者nil事务(即内部作用域未被招募)

至于影响表…SQL Server通常会进行乐观的更改,即yes更改立即应用(因此提交成本较低,回滚成本较高)-然而,隔离级别通常会阻止其他spid看到数据。具有低隔离级别(或使用NOLOCK提示)的竞争SPID将看到未提交的数据,但如果数据最终回滚,这可能是一个幻影/不可重复读取。

最新更新