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

Sql 当过程调用时,提交何时会影响实际的表?,sql,sql-server,Sql,Sql Server,我正在使用带有struts框架的ms sql。 调用过程时,我在程序中设置了autocommit false。 当程序运行时,我必须提交一个单独的事务,它必须从外部影响表 但在程序中执行conn.commit()语句之前,它永远不会被保存。 是否有其他方法在过程中提交事务,从而影响过程中单个事务末尾的表? 告诉我你是否知道 T.Saravanan您应该在同一级别启动并提交/回滚事务,否则会引入许多不可预测的路径,坦白说,这是一些糟糕的设计。因此:如果需要在服务器上提交,请在TSQL中使用BEGI

我正在使用带有struts框架的ms sql。 调用过程时,我在程序中设置了autocommit false。 当程序运行时,我必须提交一个单独的事务,它必须从外部影响表 但在程序中执行conn.commit()语句之前,它永远不会被保存。 是否有其他方法在过程中提交事务,从而影响过程中单个事务末尾的表? 告诉我你是否知道


T.Saravanan

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

不过,请注意,TSQL异常/错误处理不如在java/C#等调用者处处理错误那么丰富。如果问题是您希望将此工作与另一个无关事务解除关联,则这取决于调用代码的工作方式:

  • 如果它使用连接级别事务,则需要使用单独的连接;只需使用java/C#/which transaction API在不同的连接上运行事务(即,从声音上看,与现有代码相同,但在不同的连接上运行)
  • 如果它使用基于作用域的事务(
    TransactionScope
    在C#中;不确定java等-但这是一个LTM或DTC事务),那么您可以显式创建一个绑定到新(独立)事务或nil事务的新作用域(即内部作用域未登记)

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

重新标记,Java部分与此问题无关