分享

存储过程中的 SET XACT

 张小龙net馆藏 2018-01-08

在存储过程中写SET XACT_ABORT ON 有什么用?


SET XACT_ABORT ON是设置事务回滚的!
当为ON时,如果你存储中的某个地方出了问题,整个事务中的语句都会回滚
为OFF时,只回滚错误的地方


第一种情况:每次成功执行一条语句就立刻进行提交事务 (注意commit tran的位置)
  1. use sales --指定数据库  
  2. go  
  3.   
  4. alter table T_UserInfoTwo  
  5. add constraint ck_id check(id between 1 and 15) --给T_UserInfoTwo表的Id添加约束  
  6. go  
  7.   
  8. if exists(select * from sys.objects where name='proc_userinfotwo_insert')  
  9.     drop proc proc_userinfotwo_insert --如果存在此存储过程则删除  
  10. go  
  11.   
  12. create proc proc_userinfotwo_insert --创建存储过程  
  13. as  
  14. begin  
  15.     declare @id int  
  16.     set @id=1  
  17.     while @id<20  
  18.     begin  
  19.         begin try  
  20.             begin tran --开启事务(设置反悔点)  
  21.             insert into T_UserInfoTwo values(@id,'小雅',21,0,'18620005006','123@qq.com',' 湖南常德','朋友',1,'坏心眼女巫');        
  22.             commit tran --提交事务(不反悔,将数据插入到表中)  
  23.         end try  
  24.         begin catch  
  25.             rollback tran --抛出异常后回滚  
  26.         end catch  
  27.   
  28.         set @id =@id+1; --变量自增1  
  29.     end  
  30. end  
  31. go  


第二种情况,当循环插入数据的时候,只要抛出异常,之前所有的 操作都进行回滚 (注意commit tran的位置与第一种情况是不一样的)
  1. use sales --指定数据库  
  2. go  
  3.   
  4. alter table T_UserInfoTwo  
  5. add constraint ck_id check(id between 1 and 15) --给T_UserInfoTwo表的Id添加约束  
  6. go  
  7.   
  8. if exists(select * from sys.objects where name='proc_userinfotwo_insert')  
  9.     drop proc proc_userinfotwo_insert --如果存在此存储过程则删除  
  10. go  
  11.   
  12. create proc proc_userinfotwo_insert --创建存储过程  
  13. as  
  14. begin  
  15.     declare @id int  
  16.     set @id=1  
  17.     begin                 
  18.         begin try  
  19.             begin tran --开启事务(设置反悔点)  
  20.             while @id<20  
  21.             begin                                                         
  22.                 insert into T_UserInfoTwo values(@id,'小雅',21,0,'18620005006','123@qq.com',' 湖南常德','朋友',1,'坏心眼女巫');    
  23.                 set @id =@id+1; --变量自增1                   
  24.             end   
  25.             commit tran --提交事务(不反悔,将数据插入到表中) 特别要注意这个commit tran的位置,不如果不想每执行完一条数据就提交事务,就应该讲这个commit tran放到while循环外面来。  
  26.         end try  
  27.         begin catch           
  28.             begin  
  29.                 rollback tran --抛出异常后回滚  
  30.             end           
  31.         end catch         
  32.     end  
  33. end  
  34. go  



    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多