sql - 提交后 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 的较旧事件 - 但它们是几个小时之前的。
什么可能导致这种情况?如何记录或跟踪此类事件?
解决方案
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
推荐阅读
- android - 我怎样才能调用支付数组?使用改造
- oracle - ORA-01722: 无效的数字,但数据类型是日期,它不会以任何方式接受它
- python-3.x - 如何使用漂亮的汤仅在段落内获取锚标签的文本?
- flutter - Flutter Geofire 和 Firestore 读取问题
- python - 如何将提取的数据转换为python字典?
- sql - oracle如何选择不同的记录?
- freemarker - 如何将字符“S”转换为秒?
- android - 有没有办法从 Volley 中找出证书异常
- ruby - 使用 ruby 和 mkvextract 自动提取字幕
- django - Django多重继承避免,方法冲突