[英]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'
此过程返回一个名为@nextValue
的OUT
参数,然后我将其作为其 uid INSERT
到inventory_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 中事务处理的新手。 任何想法我错过了什么?
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.