我有一个SQL Server 2012 Sequence对象:
/****** 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
如果事务失败,所有更新都会回滚而没有问题,但是序列没有回滚,我猜是因为它超出了事务的范围。
有关处理此问题的任何线索吗?
答案 0 :(得分:1)
声明一个存储所有序列号的表,然后使用如下所示的语句:
声明 @SequenceNo int
UPDATE MySequenceNumberTable
SET @SequenceNo = SequenceNo = SequenceNo + 1
WHERE SequenceName = 'Your sequence name'
这里单个语句递增值,分配给变量并更新DB表,以保证其原子操作。由于它是一个简单的数据库更新操作,它在数据库事务中起作用如果回滚事务,则SequenceNo字段值将恢复为其先前值。
只有catch是下一个事务,要求相同序列名称的下一个值必须等到第一个事务由于行级锁定而提交或回滚。在DB序列的情况下,没有锁定序列,因此它永远不会阻止需要下一个值的其他事务。
在我们的案例中,我们根本无法获得漏洞并且需要并发保护,因此我们使用上述方法并且它对我们来说工作正常。
答案 1 :(得分:-3)
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