sql 存储过程回滚用法

create table testtable (

id nvchart(50) prim key,

name nvchart(50),

remark nvchart(50)

)

select * from testtable

 go
 BEGIN TRY
 -- SQL Server 需要显示的定义 开始一个事务.
BEGIN TRANSACTION;
-- 插入2条同样的数据,使主键重复,引发错误后回滚事务.
INSERT INTO testtable(id, name) VALUES (4, 'FOUR');
INSERT INTO testtable(id, name) VALUES (4, 'FOUR');
-- 执行成功后,需要提交事务.
COMMIT;
END TRY
 BEGIN CATCH
 PRINT('Main.错误代码 = ' + STR(ERROR_NUMBER()));
 PRINT('Main.错误严重级别 = ' + STR(ERROR_SEVERITY()));
 PRINT('Main.错误状态代码 = ' + STR(ERROR_STATE()));
 PRINT('Main.错误信息 = ' + ERROR_MESSAGE());
 -- 回滚事务
 ROLLBACK;
 END CATCH


 go
 select * from testtable;

 go


二、嵌套事务的层次是由@@TranCount全局变量反映出来的。

每一次Begin Transaction都会引起@@TranCount加1。而每一次Commit Transaction都会使@@TranCount减1,而RollBack Transaction会回滚所有的嵌套事务包括已经提交的事务和未提交的事务,而使@@TranCount置0。

例如

 
 BEGIN TRAN --@@TRANCOUNT值为0
      SELECT @@TRANCOUNT --值为1
          BEGIN TRAN
                SELECT @@TRANCOUNT --值为2
          COMMIT TRAN
          SELECT @@TRANCOUNT --值为1
  ROLLBACK TRAN
  SELECT @@TRANCOUNT --值为0
    
三、

在SQL Server中使用rollback会回滚所有的未提交事务状态,但是有些时候我们只需要回滚部分语句,把不需要回滚的语句提到事务外面来,虽然是个方法,但是却破坏了事务的ACID。

其实我们可以使用SQL Server中的Savepoints来解决上述问题。

示例如下:

1.先建立测试表: 
CREATE TABLE [dbo].[ttt]( 
    [Id] [int] NULL, 
    [mark] [int] NULL 
)

 

2.SQL 语句 
begin tran 
    insert into ttt values(3,'3'); 
save tran point1 
    insert into ttt values(4,'4');

rollback tran point1

commit

 

执行结果如下: 
Id    mark 
3    3

可见,虽然3,4都在一个事务中,但是由于使用了SavePoints,所以3被提交了,4被回滚了。





  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值