什么时候提交会在程序调用时影响实际的表?

时间:2011-04-22 05:41:04

标签: sql sql-server

我正在使用带有struts框架的ms sql。 在调用程序时,我在程序中输入了autocommit false。 当程序运行时,我必须提交一个单独的事务,它必须在外部影响表 但是在conn.commit()语句在程序中执行之前,它永远不会保存。 是否有任何其他方式在过程本身中提交事务,以影响过程中单个事务结束时的表? PL。告诉我你是否知道。

T.Saravanan

1 个答案:

答案 0 :(得分:1)

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

但请注意,TSQL异常/错误处理不如在java / C#等调用者处理错误一样丰富。如果问题是您想要将此工作与其他不相关的事务取消关联,那么这取决于您的调用代码的工作方式:

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

至于影响表... SQL Server通常会做出乐观的改变,即立即应用更改(因此提交便宜,回滚更昂贵) - 但是,< strong> 隔离级别 通常会阻止其他SPID查看数据。具有低隔离级别(或使用NOLOCK提示)的竞争SPID将看到未提交的数据,但如果数据最终被回滚,则这可能是幻像/不可重复读取。