3、事务设置保存点
利用save transaction 和rollback transaction 语句:
---开启事务 begin tran --错误捕捉机制,看好啦,这里也有的。并且可以嵌套。 begin try --语句正确 insert into lives (Eat,Play,Numb) values ('猪肉','足球',1) --加入保存点 save tran pigOneIn insert into lives (Eat,Play,Numb) values ('猪肉','足球',2) insert into lives (Eat,Play,Numb) values ('狗肉','篮球',3) end try begin catch select Error_number() as ErrorNumber, --错误代码 Error_severity() as ErrorSeverity, --错误严重级别,级别小于10 try catch 捕获不到 Error_state() as ErrorState , --错误状态码 Error_Procedure() as ErrorProcedure , --出现错误的存储过程或触发器的名称。 Error_line() as ErrorLine, --发生错误的行号 Error_message() as ErrorMessage --错误的具体信息 if(@@trancount>0) --全局变量@@trancount,事务开启此值+1,他用来判断是有开启事务 rollback tran end catch if(@@trancount>0) rollback tran pigOneIn --表本身为空表,ID ,Numb为int 类型,其它为nvarchar类型 select * from live
注:事务保存点以上的都将影响,当提交事务以后,只有保存点之前的语句被执行。
事务保存点示例:
在SQL Server中使用rollback会回滚所有的未提交事务状态,但是有些时候我们只需要回滚部分语句,把不需要回滚的语句提到事务外面来,虽然是个方法,但是却破坏了事务的ACID。
SQL中使用事务保存点,即可解决这个问题。
SQL 事务中存在错误信息 进行Catch 回滚事务时
begin try begin tran A insert into dbo.lives ( Eat, Play, Numb, times ) values ( 'A', '', 0, getdate() ) select 1/0 --错误信息 save tran B_Point insert into dbo.lives ( Eat, Play, Numb, times ) values ( 'B', '', 0, getdate() ) save tran C_Point insert into dbo.lives ( Eat, Play, Numb, times ) values ( 'C', '', 0, getdate() ) rollback tran B_Point --回滚事务点B_Point 即事务点下的部分都回滚 select 1 commit tran A --提交整个事务信息 end try begin catch select 2 rollback tran B_Point --回滚事务点B_Point 即事务点下的部分都回滚 commit tran A --提交整个事务信息 end catch go select * from dbo.lives g
SQL回滚局部信息时:
begin try begin tran A insert into dbo.lives ( Eat, Play, Numb, times ) values ( 'A', '', 0, getdate() ) --select 1/0 --错误信息 save tran B_Point insert into dbo.lives ( Eat, Play, Numb, times ) values ( 'B', '', 0, getdate() ) save tran C_Point insert into dbo.lives ( Eat, Play, Numb, times ) values ( 'C', '', 0, getdate() ) rollback tran B_Point --回滚事务点B_Point 即事务点下的部分都回滚 select 1 commit tran A --提交整个事务信息 end try begin catch select 2 rollback tran B_Point --回滚事务点B_Point 即事务点下的部分都回滚 commit tran A --提交整个事务信息 end catch go select * from dbo.lives g
回滚保存点B时 即保存点以下部分均要回滚,
注:使用保存点 无论try 或 catch 代码块 除提交或回滚保存点外,都要COMMIT或 ROLLBACK完整事务。
使用场景:当操作数据时前校验数据成本太高且数据出错率不高时 可采用.eg:用户下单 检查库存信息是否>0时 可以设置库存量需>=0的约束 当更新库时信息小于0即出错 进行事务回滚 并查询返回当前库存信息。