常用存储过程事务的基本结构
---开启事务
begin tran
--错误扑捉机制,看好啦,这里也有的。并且可以嵌套。
begin try
--这里面写执行语句
select * from dbo.i_UserWorkType
end try
begin catch
if(@@trancount>0) --全局变量@@trancount,事务开启此值+1,他用来判断是有开启事务
rollback tran ---由于出错,这里回滚到开始,第一条语句也没有插入成功。
end catch
if(@@trancount>0)
commit tran --提交事务
测试
在此做一个测试,分别进行增删改,看能否正常回滚
未做执行前,进行的查询结果
准备执行的语句 :
---开启事务
begin tran
--错误扑捉机制,看好啦,这里也有的。并且可以嵌套。
begin try
----------------------
--这三条都是正确的语句
----------------------
--增
INSERT INTO dbo.i_UserWorkType(UserNo,Calendar,WorkType,UserName,WorkTime,ChangeTime)
VALUES('0309110122','2017-12-22','B','杨沫','8:30~17:30',GETDATE())
--删除UserNo为0309110119和WorkType为B的这条数据
DELETE dbo.i_UserWorkType
WHERE UserNo='0309110119' AND WorkType='B'
--更改数据为“李某”为“李某某”
UPDATE dbo.i_UserWorkType
SET UserName='李某某'
WHERE UserName='李某'
---------------------
--这一条是错误的语句
---------------------
INSERT INTO dbo.i_UserWorkType(ChangeTime)
VALUES('不是时间格式')
end try
begin catch
if(@@trancount>0) --全局变量@@trancount,事务开启此值+1,他用来判断是有开启事务
rollback tran ---由于出错,这里回滚到开始,第一条语句也没有插入成功。
end catch
if(@@trancount>0)
commit tran --提交事务
select * from dbo.i_UserWorkType
执行后的结果为:
与未执行前结果一样
那我们把事务去掉后,只执行Try里的语句结果会怎样呢
结果:
成功地增加了一条叫“杨沫”的数据
成功地删除了UserNo为“0309110119”和WorkType为“B”的数据
成功地更改了“李某”的数据,改成了“李某某”
结论:
这事务是有效的,并且所做的增删改都能进行回滚