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