gpt4 book ai didi

sql - 回滚 SQL Server 2012 序列

转载 作者:行者123 更新时间:2023-12-05 08:13:04 25 4
gpt4 key购买 nike

我有一个 SQL Server 2012 序列对象:

/****** Create Sequence Object ******/
CREATE SEQUENCE TestSeq
START WITH 1
INCREMENT BY 1;

我有一个在事务中运行一些查询的 SP:

BEGIN TRAN

SELECT NEXT VALUE FOR dbo.TestSeq

<here all the query update code......>

ROLLBACK TRAN

如果事务失败,所有更新都会毫无问题地回滚,但序列不会回滚,我猜是因为它超出了事务的范围。

有任何处理方法的线索吗?

最佳答案

声明一个存储所有序列号的表,然后使用下面给出的语句:

声明 @SequenceNo 整数

    UPDATE MySequenceNumberTable
SET @SequenceNo = SequenceNo = SequenceNo + 1
WHERE SequenceName = 'Your sequence name'

这里的单个语句递增值,分配给变量并更新数据库表,因此保证了其原子操作。由于它是一个简单的数据库更新操作,因此它在数据库事务中发挥作用。如果事务被回滚,则 SequenceNo 字段值将恢复为之前的值。

唯一的问题是下一个事务需要相同序列名称的下一个值必须等到第一个事务提交或回滚,因为行级锁定。在数据库序列的情况下,没有序列锁定,因此它永远不会阻塞需要下一个值的其他事务。

在我们的例子中,我们根本不能有漏洞并且需要并发保护,所以我们使用上面的方法并且它对我们来说工作得很好。

关于sql - 回滚 SQL Server 2012 序列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12118268/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com