[SQL Server]嵌套事务与分布式事务

本文介绍了SQL Server中的嵌套事务和分布式事务。嵌套事务在@@trancount计数器中记录,只有最外层的Commit Tran会提交更改。如果试图回滚内层事务,将会引发错误。解决嵌套事务问题可以使用保存点,但分布式事务不支持保存点。在可能涉及分布式事务的存储过程中,建议根据事务层级决定是否提交并抛出异常,以便外部事务处理回滚。
摘要由CSDN通过智能技术生成

 Sql Server支持嵌套事务:也就是说在前一事务未完成之前可启动一个新的事务,只有在外层的Commit Tran语句才会导致数据库的永久更改。
请尝试执行以下语句:

BEGIN  TRAN  tr0
       BEGIN TRAN tr1
       ROLLBACK TRAN tr1 
ROLLBACK TRAN tr0

执行结果:服务器: 消息 3903,级别 16,状态 1,行 5
ROLLBACK TRANSACTION 请求没有对应的 BEGIN TRANSACTION。

原因分析:
1)    Sql Server把每个连接开启的事务数目记录在全局变量@@trancount中,就象计数器一样,每个Begin Tran语句会让@@trancount自增1,每个Commit Tran语句会让@@trancount自减1,只有最外层的Commit Tran(当@@trancount=1)会将更改影响到数据库中,而不再存储在事务日志中。

2)   Sql Server只会记录外层事务名称如果企图回滚任一内层事务,错误就会出现。
3)    非常遗憾的是,不管嵌套的事务层次有多深,不带保存点的Rollback Tran语句将直接把@@trancount设置为0

解决思路:
1)   采用保存点:Sql Server提供了一种用于回滚部分事务的机制:Save Tran ,它不会对@@trancount产生任何影响,只是标记回滚事务时可以到达的点。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值