繁体   English   中英

SQL Server事务计数

[英]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事务。 在此处输入图片说明

图2 :单个ROLLBACK总是回滚整个事务。 在此处输入图片说明

保存点提供了一种回滚部分事务的机制。 用户可以在事务中设置保存点或标记。 保存点定义了在有条件取消部分交易的情况下交易可以返回的位置。 SQL Server允许您通过SAVE TRAN语句使用保存点,这不会影响@@ TRANCOUNT值。 回滚到保存点(不是事务)也不会影响@@ TRANCOUNT返回的值。 但是,回滚必须显式命名保存点:使用不带特定名称的ROLLBACK TRAN总是回滚整个事务。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM