![](/img/trans.png)
[英]Transaction count after EXECUTE indicates that a COMMIT or ROLLBACK TRANSACTION statement is missing - SQL server 2005
[英]SQL Server transaction count
SELECT @@TRANCOUNT
BEGIN TRAN T1
SELECT @@TRANCOUNT
BEGIN TRAN T2
SELECT @@TRANCOUNT
ROLLBACK TRAN T2
SELECT @@TRANCOUNT
ROLLBACK TRAN T1
SELECT @@TRANCOUNT
我想在@@ trancount上讨论一下。 @@ trancount有五个。 第一个值为0。 第二个具有值1。第三个具有值2。在第四个trancount之前,它遇到错误(因为没有用于回滚的保存检查点),因此值2将继续。 到目前为止,我明白了逻辑。 问题出现在最后一个@@ trancount上,因为它也应该遇到一个错误(根据我的知识),因为没有回滚的保存点,因此它应该保留值2。但是,取而代之的是将输出显示为0。请帮助我知道为什么最后一次付款是0而不是2。
ROLLBACK TRAN
transaction_name必须引用最外层的事务名称,否则它将失败。 您可以像这样修复脚本
SELECT @@TRANCOUNT
BEGIN TRAN T1
SELECT @@TRANCOUNT
BEGIN TRAN T2
SELECT @@TRANCOUNT
ROLLBACK TRAN T1
SELECT @@TRANCOUNT
IF @@TRANCOUNT>0
ROLLBACK TRAN T1
SELECT @@TRANCOUNT
请注意,您可以使用COMMMIT TRAN T2
您可以尝试SAVE TRAN
或回滚将影响整个事务,因为没有定义保存点。
SELECT @@TRANCOUNT
BEGIN TRAN t1
SELECT @@TRANCOUNT
BEGIN TRAN T2
SAVE TRAN T2 --<<
SELECT @@TRANCOUNT
ROLLBACK TRAN T2
SELECT @@TRANCOUNT
ROLLBACK TRAN t1
SELECT @@TRANCOUNT
https://msdn.microsoft.com/zh-CN/library/ms187967.aspx
BEGIN TRANSACTION语句将@@ TRANCOUNT递增1。ROLLBACK TRANSACTION将@@ TRANCOUNT减为0,但ROLLBACK TRANSACTION savepoint_name除外,该点不会影响@@ TRANCOUNT。 提交事务或提交工作递减@@ TRANCOUNT 1。
不错的文章: http : //www.codeproject.com/Articles/4451/SQL-Server-Transactions-and-Error-Handling
图1 :COMMIT始终通过减少事务计数来平衡BEGIN事务。
保存点提供了一种回滚部分事务的机制。 用户可以在事务中设置保存点或标记。 保存点定义了在有条件取消部分交易的情况下交易可以返回的位置。 SQL Server允许您通过SAVE TRAN语句使用保存点,这不会影响@@ TRANCOUNT值。 回滚到保存点(不是事务)也不会影响@@ TRANCOUNT返回的值。 但是,回滚必须显式命名保存点:使用不带特定名称的ROLLBACK TRAN总是回滚整个事务。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.