sql 事务和回滚

(1)

set ANSI_NULLS ON --见图1
set QUOTED_IDENTIFIER ON
go

ALTER proc [dbo].[procname]
as
begin
    begin transaction
    DECLARE @myerror INT  
    set @myerror=0  
    delete from tbname
    SET @myerror=@myerror+@@ERROR 
    insert into tbname2 select * from tbname where a>1
    SET @myerror=@myerror+@@ERROR 

    IF @myerror>0
        begin
        rollback transaction
        end
    else
        begin
        commit transaction
        end

end

图1

当ANSI_NULLS置ON,比较要用is而不是=

set XACT_ABORT ON   ---如果不设置该项为ON,在sql中默认为OFF,那么只只回滚产生错误的 Transact-SQL 语句;设为ON,回滚整个事务

begin tran t1 ---启动一个事务

update [water].[dbo].[ErrorInf] set ErrorMessage='test' where ID=6

insert into [water].[dbo].[ErrorInf]([ID],ErrorMessage,[Description])Values(1,'test1','test1')

commit tran t1  ---提交事务

sql2005支持try

BEGIN TRY
   BEGIN TRANSACTION
     insert into dbo.area values('1111')
    insert into dbo.area values('2222')
    select 1/0
    insert into dbo.area values('333')
   COMMIT
END TRY
BEGIN CATCH
   IF @@TRANCOUNT > 0
     ROLLBACK

  DECLARE @ErrMsg nvarchar(4000), @ErrSeverity int
  SELECT @ErrMsg = ERROR_MESSAGE(),
         @ErrSeverity = ERROR_SEVERITY()

  RAISERROR(@ErrMsg, @ErrSeverity, 1)
END CATCH

 +

20160822

alter proc P002 
(
@i2 varchar(20)
)
as
begin tran t001
    begin try 
        insert into dbo.t_test4 (i2)values(@i2)
        commit tran t001
    end try 

    begin catch
        print convert(nvarchar, ERROR_NUMBER())+ ':返回错误号'

        print convert(nvarchar,ERROR_MESSAGE()) +':返回错误信息'  

        print convert(nvarchar,ERROR_LINE()) +':返回错误所在的行' 

        print convert(nvarchar,ERROR_PROCEDURE()) +':返回出现错误的存储过程或触发器的名称。如果在存储过程或触发器中未出现错误,该函数返回 NULL'   

        print convert(nvarchar,ERROR_STATE()) +':返回状态' 

        print convert(nvarchar,ERROR_SEVERITY()) +':返回严重性' 

        rollback tran t001
    end catch
原文地址:https://www.cnblogs.com/roboot/p/5038168.html