在begin tran前加上set xact_abort on即可保证事务的一致性create PROCEDURE dbo.testtrans
AS

set xact_abort on begin tran                         --语句1
insert test1(M1)values('sds')      --语句2
insert test1(M2)values('name')     --语句3
print '----ok------'    --语句4
 commit tran                       --语句5
RETURN 

解决方案 »

  1.   

    set xact_abort on
    加上当然是可以的了,那么不加set xact_abort on
    begin tran                         --语句1
    insert test1(M1)values('sds')      --语句2
    insert test1(M2)values('name')     --语句3
    print '----ok------'    --语句4
     commit tran           

             insert test1(M1)values('sds')      --语句2
    insert test1(M2)values('name')     --语句3
    print '----ok------'    --语句4
    有什么区别,执行实际的结果都一样?
      

  2.   

    --看懂下面的例子:SET XACT_ABORT 为 ON  -- Transact-SQL 语句产生运行时错误,整个事务将终止并回滚。BEGIN TRANINSERT INTO t2 VALUES (1)
    INSERT INTO t2 VALUES (2) /* Foreign key error */
    INSERT INTO t2 VALUES (3)COMMIT TRANSET XACT_ABORT 为 OFF  -- 只回滚产生错误的 Transact-SQL 语句BEGIN TRANINSERT INTO t2 VALUES (1)
    INSERT INTO t2 VALUES (2) /* Foreign key error */
    INSERT INTO t2 VALUES (3)COMMIT TRAN
      

  3.   

    SET XACT_ABORT
    指定当 Transact-SQL 语句产生运行时错误时,Microsoft® SQL Server™ 是否自动回滚当前事务。语法
    SET XACT_ABORT { ON | OFF }注释
    当 SET XACT_ABORT 为 ON 时,如果 Transact-SQL 语句产生运行时错误,整个事务将终止并回滚。为 OFF 时,只回滚产生错误的 Transact-SQL 语句,而事务将继续进行处理。编译错误(如语法错误)不受 SET XACT_ABORT 的影响。对于大多数 OLE DB 提供程序(包括 SQL Server),隐性或显式事务中的数据修改语句必须将 XACT_ABORT 设置为 ON。唯一不需要该选项的情况是提供程序支持嵌套事务时。有关更多信息,请参见分布式查询和分布式事务。 SET XACT_ABORT 的设置是在执行或运行时设置,而不是在分析时设置。
      

  4.   

    加上当然是可以的了,那么不加set xact_abort on
    begin tran                         --语句1
    insert test1(M1)values('sds')      --语句2
    insert test1(M2)values('name')     --语句3
    print '----ok------'    --语句4
     commit tran           

             insert test1(M1)values('sds')      --语句2
    insert test1(M2)values('name')     --语句3
    print '----ok------'    --语句4
    有什么区别,执行实际的结果都一样?

    ==============
    下面的是隐 性事务
      

  5.   

    --问题2可以这样写
    ALTER PROCEDURE dbo.testtrans
     @xml nvarchar(4000)
    as
          declare @hDoc int  
         exec sp_xml_preparedocument @hDoc output ,@Xml   
       --省略中间使用XML的语句
          begin tran
    insert test1(message)values('sds')
               if @@error<>0 goto Inerror
              insert test1([name])values('name')                   
               if @@error<>0 goto Inerror
          commit tran
     exec sp_xml_removedocument @hDoc          
             return
    Inerror:
     begin
       rollback
       exec sp_xml_removedocument @hDoc
       return
     end
    go
      

  6.   

    ALTER PROCEDURE dbo.testtrans (
    @xml nvarchar(4000)
    )AS

    declare @hDoc int  
    exec sp_xml_preparedocument @hDoc output ,@Xml  --1
    --省略中间使用XML的语句
    begin tran
    insert test1(message)values('sds')
    insert test1([name])values('name')        --2
             if @@error <> 0 
        begin 
    ....
    return
    end
     commit tran
     exec sp_xml_removedocument @hDoc              --3
      

  7.   

    看了大家对问题2的解决方法,大家可能没有理解我说的问题.
    我说了insert test1([name])values('name') 出错的时候,这个存储过程都停止执行了.
    以下的判断语句if @@error <> 0 还有跳转语句,更本没有机会执行?!!!