事物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动态执行的错误号也都能捕捉到。