繁体   English   中英

如何回滚更新表的存储过程

[英]How to rollback stored procedure that updates a table

为什么这个ROLLBACK TRANSACTION语句不起作用?

BEGIN TRANSACTION;
DECLARE @foo INT
EXECUTE [database].[dbo].[get_counter] @CounterID='inventory_records', @nextValue=@foo OUTPUT;
ROLLBACK TRANSACTION;

背景

我正在将记录插入到基于 SQL Server 19 构建的客户 ERP 系统中。ERP 数据库没有自动递增的主键。 相反,它使用一个名为counters的表,其中每一行都有一个counterID字段和一个整value字段。

要将新行插入到表中,例如inventory_record ,我首先需要调用这样的存储过程:

EXECUTE get_counter @counterID='inventory_record'

此过程返回一个名为@nextValueOUT参数,然后我将其作为其 uid INSERTinventory_record表中。

如果我的插入失败,我需要ROLLBACK这个存储过程的行为。 这样计数器不会在失败的INSERT尝试中无限增加。

get_counter存储过程的内容

这很简单,但也受版权保护。 我在这里总结和截断了。 计数器作为序列存储在 DB 中。 因此get_counter在检查请求的计数器是否合法后调用sp_sequence_get_range

ALTER PROCEDURE get_counter
    @strCounterID varchar(64),
    @iIncrementValue integer = 1, 
    @LastValue BIGINT = NULL OUTPUT
AS

SET NOCOUNT ON
BEGIN

DECLARE 
          @nextSeqVar SQL_VARIANT
        , @lastSeqVar SQL_VARIANT

-- code that confirms valid counter name

BEGIN TRY
    -- code that calls [sp_sequence_get_range]
END TRY
BEGIN CATCH
    THROW
END CATCH

RETURN(@LastValue)
END

问题

inventory_record计数器总是递增。 我无法回滚它。

如果我从 SSMS 运行此问题顶部的 SQL,然后SELECT value FROM counters WHERE counterID = 'inventory_record' ,则每次执行时计数器都会增加。

我是 SQL Server 中事务处理的新手。 任何想法我错过了什么?

重新发布评论作为答案以获得更好的可读性。

get_counter使用Sequence Numbers ( sp_sequence_get_range )。 请参阅有关限制部分的文档

序列号是在当前事务范围之外生成的。 无论使用序列号的事务是提交还是回滚,它们都会被消耗

你可以在这里看到一个简单的演示

暂无
暂无

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

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