首页 > 解决方案 > 提交后 SQL 事务意外回滚

问题描述

我们有一个 SQL 脚本(在我们的会计应用程序中发布发票),如下所示:

SET XACT_ABORT ON;
BEGIN TRY
  BEGIN TRANSACTION;
  --
  --Insert/Update a lot of tables
  --
  WHILE @@TRANCOUNT > 0
    COMMIT TRAN;
END TRY
BEGIN CATCH
  WHILE @@TRANCOUNT > 0
    ROLLBACK TRAN;
  DECLARE @ErrorMessage NVARCHAR(4000)
  DECLARE @ErrorSeverity INT
  DECLARE @ErrorState INT
  SELECT @ErrorMessage = ERROR_MESSAGE(),
         @ErrorSeverity = ERROR_SEVERITY(),
         @ErrorState = ERROR_STATE()
  RAISERROR (@ErrorMessage, @ErrorSeverity, @ErrorState)
END CATCH

在交易发布结束时,我们打印涉及查询刚刚发布的数据的交易。所以我们知道交易确实完成了——它是在纸上用黑白打印的!

现在,此脚本在每分钟发布 1000 笔交易的繁忙站点中的 100 位客户中的工作时间为 99.9999%。但是随机(十万分之一)我们刚刚发布的交易消失了???整个事务似乎已经完全回滚了。

我想知道 SQL Server 是否进入了某种恢复模式。但我似乎在 SSMS 或 Windows 事件查看器中看不到任何日志(所以我不认为是这种情况)。我正在查看“事件查看器”/“Windows 日志”/“应用程序”。我可以在此处看到 SQL Server 的较旧事件 - 但它们是几个小时之前的。

什么可能导致这种情况?如何记录或跟踪此类事件?

标签: sqlsql-servertsqltransactionsrollback

解决方案


SQL 事务存储过程

试试这个 SQL 存储过程脚本

begin tran
begin try
--
--Insert/Update a lot of tables
--

if @@trancount > 0 commit tran
end try
begin catch
if @@trancount > 0 rollback tran

DECLARE @ErrorMessage NVARCHAR(4000);  
DECLARE @ErrorSeverity INT;  
DECLARE @ErrorState INT;  

SELECT   
   @ErrorMessage = ERROR_MESSAGE(),  
   @ErrorSeverity = ERROR_SEVERITY(),  
   @ErrorState = ERROR_STATE();  

RAISERROR (@ErrorMessage, @ErrorSeverity, @ErrorState);  

end catch


推荐阅读