2016-02-19 120 views
0
SELECT @@TRANCOUNT 
BEGIN TRAN T1  
SELECT @@TRANCOUNT 
    BEGIN TRAN T2    
    SELECT @@TRANCOUNT 
    ROLLBACK TRAN T2   
SELECT @@TRANCOUNT 
ROLLBACK TRAN T1 
SELECT @@TRANCOUNT   

我想在@@ trancount上讨论一下。有5个@@ trancount。第一个值为0。第二个值为1.第三个值为2.在第四次计算之前,它遇到一个错误(因为没有回滚的保存检查点),所以值2将继续。高兴这我得到的逻辑。问题出现在最后@@ trancount,因为它应该也会遇到一个错误(根据我的一半知识),因为没有回滚保存点,因此它应该保留值2.但不是它将输出显示为0。请帮助我知道为什么最后一笔转帐是0而不是2。SQL Server事务计数

+0

花点时间阅读帮助中心的[编辑帮助](http://stackoverflow.com/editing-help)。堆栈溢出的格式与其他站点不同。您的帖子看起来越好,用户就越容易帮助您。 –

+0

您的脚本失败,ROLLBACK TRAN transaction_name必须引用最外面的事务名称,否则它将失败。 – Jaco

回答

0

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

0

您可以尝试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/en-us/library/ms187967.aspx

的由1 ROLLBACK BEGIN TRANSACTION语句增量@@ TRANCOUNT 交易递减@@ TRANCOUNT为0,除了ROLLBACK TRANSACTION savepoint_name,这并不影响@@ TRANCOUNT。通过1

尼斯文章COMMIT TRANSACTION或COMMIT WORK减量@@ TRANCOUNT: http://www.codeproject.com/Articles/4451/SQL-Server-Transactions-and-Error-Handling

图1:甲COMMIT总是平衡一个通过由一个减少事务计数BEGIN TRANSACTION。 enter image description here

图2:单个ROLLBACK总是回退整个事务。 enter image description here

保存点提供了回滚事务部分的机制。 A 用户可以在事务中设置保存点或标记。 保存点定义了事务可以返回的位置,如果事务的部分 被有条件地取消。 SQL Server允许您通过SAVE TRAN语句使用保存点 ,这不影响 @@ TRANCOUNT值。回滚到保存点(而非事务) 不会影响@@ TRANCOUNT返回的值。但是, 回退必须明确指定保存点:使用ROLLBACK TRAN 没有特定名称将始终回滚整个事务。

+0

谢谢你的答案。但是我想在@@ trancount上讨论一下。有5个@@ trancount。第一个值为0。第二个值为1.第三个值为2.在第四次计算之前,它遇到一个错误(因为没有回滚保存检查点),所以值2将继续。高兴这我得到的逻辑。问题出现在最后一个@@ trancount,因为它应该也会遇到一个错误,因为没有回滚的保存点并保留2.但是,它不会显示输出为0.请帮助我知道为什么最后一个trancount是0为2. – 234

+0

对不起,我没有看到问题出在哪里。 T1是整个交易。用'BEGIN TRAN EXEC('...来自答案...')SELECT @@ TRANCOUNT ROLLBACK'围住它,你会得到一个关于T1丢失保存点的错误。因为它变成了嵌套事务。 –