2012-03-06 69 views
-1

这里是条纹出为什么SQL事务没有被回滚?

USE databaseName 

BEGIN TRY 
    DECLARE @count INT 
    DECLARE @ErrorMsg VARCHAR(MAX) 

    SET @count=(SELECT COUNT(*) 
       FROM xxxtable 
       WHERE xxxcolumn = 'xxx') 

    IF(@count = 0) --This means that the script has not been run yet  
     BEGIN 
      BEGIN TRANSACTION 

      --do work in here 
      COMMIT TRANSACTION 
     END 
    ELSE 
     BEGIN 
      SELECT 'This script has already been run before. Cannot run it again.' 
     END 
END TRY 

BEGIN CATCH 
    IF(Xact_state() <> 0) 
     BEGIN 
      ROLLBACK TRAN 

      PRINT('ROLLED BACK TRANSACTION') 

      SELECT Error_number() AS error_number, 
       Error_line() AS error_line, 
       Error_message() AS error_message 
     END 
END CATCH 

不必要的部分脚本当脚本失败,它进入catch块并打印回退的事务,并且还显示了选择语句的结果(错误消息等)。

但是当我检入数据库时​​,直到失败点的数据被提交。我在这里做错了什么?

更新:回滚数据后,可用的最新身份值发生变化。 (假设可用的最高身份是10,如果我插入并回滚,则可用的最高身份是11而不是10)。所以回滚不会将数据库返回到事务之前的状态。这是导致问题的原因。

+0

是否有可能在剥离代码中提交隐藏?你有没有试图监控你的语句的执行情况,看看你的数据库发生了什么改变? – Gambrinus 2012-03-06 14:55:20

+0

在条形码中没有提交。最后只有一个提交,如上面的脚本所示:( – developer747 2012-03-06 14:57:22

+0

当脚本失败时,你会得到什么错误信息 – HLGEM 2012-03-06 15:20:11

回答

1

根据您的更新 re:IDENTITY值,这是预期的行为。回滚将不会重置IDENTITY值,因此它会在您的ID值中产生间隙。

想必这就是你的意思是当你说“的数据,直到故障点是犯了” - 而不是插在交易,你已经更新了所有的数据/仍然存在假定的回滚之后。

+0

你是对的 – developer747 2012-03-06 15:52:07