1. --事务示例  
  2. --问题帖子  
  3. --http://bbs.51cto.com/viewthread.php?tid=910758&page=1#pid4682059  
  4. --示例场景:某企业订单系统在保存过程中使用事务,涉及2张表,一张表头,一张表体,需要保存一个订单数据,在保存过程中使用事务保护。  
  5. --create table  
  6. create table #tableHead  
  7. (  
  8.     ID INT identity(1,1),  
  9.     Bill varchar(20) primary key--定义一个pk,方便后续测试  
  10.     CompanyName varchar(200)  
  11. )  
  12.  
  13. create table #tableDetail  
  14. (  
  15.     ID int identity(1,1),  
  16.     HeadID int,  
  17.     ProductName varchar(200),  
  18.     ProductQuantity int 
  19. )  
  20. --save data  
  21. --下面的是一个完整的事务使用方式,大家注意后半部分从事务检查到结束,这里是一个典型的写法,适合大多数场景  
  22. --可以多次执行下面语句,第一不会有问题,后续如果不修改insert 到 #tableHead 的值就会出现回滚,提示如下:  
  23. /*  
  24.     消息 2627,级别 14,状态 1,第 3 行  
  25.     违反了 PRIMARY KEY 约束 'PK__#tableHe__52B56D1D7E37BEF6'。不能在对象 'dbo.#tableHead' 中插入重复键。  
  26.     语句已终止。  
  27.  
  28.     (1 行受影响)  
  29. */  
  30. --约束名称可以能不一样。  
  31. --可以通过select * from #tableHead 检查数据  
  32. --select * from #tableDetail  
  33. --注意,本示例需要在每次对数据库操作的地方检查是否有错误。  
  34. begin TRANSACTION --开始事务  
  35. declare @hid int 
  36. insert into #tableHead(Bill,CompanyName) values('20120101','51CTO公司')  
  37. IF (@@ERROR <> 0) --检查是否有错误  
  38.     GOTO QuitWithRollback --跳转到回归事务代码位置  
  39. select @hid=SCOPE_IDENTITY()  
  40. insert into #tableDetail (HeadID,ProductName,ProductQuantity) values(@hid,'51CTO包包',10)  
  41. insert into #tableDetail (HeadID,ProductName,ProductQuantity) values(@hid,'51CTO笔记本',5)  
  42. IF (@@ERROR <> 0) --检查是否有错误  
  43.     GOTO QuitWithRollback --跳转到回归事务代码位置  
  44. COMMIT TRANSACTION --提交事务  
  45. GOTO EndSave --正常跳转到结束  
  46. QuitWithRollback: --回滚事务  
  47.     IF (@@TRANCOUNT > 0) --检查是否有事务  
  48.         ROLLBACK TRANSACTION  --回滚事务  
  49. EndSave: --程序结束