3

我有一个 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

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

有什么线索可以处理吗?

4

2 回答 2

1

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

声明@SequenceNo int

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

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

只有 catch 是下一个需要相同序列名称的下一个值的事务必须等到第一个事务由于行级锁定而被提交或回滚。在 DB 序列的情况下,没有序列锁定,因此它永远不会阻塞需要下一个值的其他事务。

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

于 2015-07-21T10:26:24.997 回答
-4

ROLLBACK 语句以下列方式用于取消整个事务:

BEGIN TRANSACTION
...
SQL Statement(s)

...
ROLLBACK TRANSACTION

ROLLBACK 命令也可用于以下列方式取消部分事务:

BEGIN TRANSACTION
...
SQL Statement(s)

SAVE TRANSACTION savepoint_name

SQL Statement(s)

ROLLBACK TRANSACTION savepoint_name
于 2012-09-08T09:35:26.770 回答