事物及exec

事物3要出不多讲:

1.BEGIN TRANSACTION--开启事务

2.COMMIT TRANSACTION--事务执行

3.ROLLBACK TRANSACTION--事务回滚

 

俩总捕捉事物的方式

一:记录错误号:这种方式

1.这种方式的代码在错误发生后会一直执行下去。
ALTER PROC [dbo].[trans]
  @num NVARCHAR(20)
  AS
  BEGIN TRANSACTION--开启事务
   SELECT * FROM trantest(TABLOCKX)
   --动态执行语句
   DECLARE @sql NVARCHAR(200),@error INT 
   SET @error=0
   PRINT '开始测试1'
   --INSERT INTO trantest(num) values(@num)
   SET @sql='INSERT INTO trantest(num) values(@num)'
   EXECUTE sp_executesql @sql,N'@num nvarchar(20) ',@num
   SET @error=@error+@@error--接收错误号

   PRINT @error 
   IF @error=0
   BEGIN 
        PRINT '执行事务'
        COMMIT TRANSACTION--事务执行
   END 
   ELSE    
   BEGIN
        PRINT '回滚事务'
        ROLLBACK TRANSACTION--事务回滚
   END 
GO

二:try catch 方式捕捉,这种方式

1.在发生错误后,会直接调整到catch语句,后面的语句就不再执行

CREATE PROC [dbo].[TryTrans]
  @num NVARCHAR(20)
  AS
        BEGIN TRANSACTION
          DECLARE @sql NVARCHAR(200),@error INT 
        SET @error=0
  BEGIN TRY
        --动态执行语句

        PRINT '开始测试1'
        --INSERT INTO trantest(num) values(@num)
        SET @sql='INSERT INTO trantest(num) values(@num)'
        EXECUTE sp_executesql @sql,N'@num nvarchar(20) ',@num
        PRINT '异常外'

  END TRY
  BEGIN CATCH
        PRINT '出现异常,错误编号:' + convert(varchar,error_number()) + ',错误消息:' + error_message()
        SET @error = @error + 1
  END CATCH

IF(@error > 0)
    BEGIN
        --执行出错,回滚事务
        ROLLBACK TRAN;
        PRINT '转账失败,取消交易!';
    END
ELSE
    BEGIN
        --没有异常,提交事务
        COMMIT TRAN;
        PRINT '转账成功!';
    END
  
  GO

上面两种调用方式:EXEC trans @num=123456789011

 

上面2个语句都用到了exec动态执行语句,@@error为全局的,经过测试exec动态执行的错误号也都能捕捉到。

posted @ 2016-09-05 22:25  zhuyapeng  阅读(432)  评论(0编辑  收藏  举报