2012-08-25 63 views
1

我有一個SQL Server 2012的序列對象:回滾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 

如果交易失敗,全部更新回滾沒有問題,但序列不回滾我猜是因爲它超出了事務的範圍。

任何線索來處理?

+2

你不能回滾序列,它不支持事務處理,你可以做什麼是存儲在一個變量當前序列,並在發生任何錯誤前,你可以改變異常塊序列:與@var 'ALTER SEQUENCE TestSeq RESTART INCREMENT BY 1;' –

+2

我認爲會更好地保留它,因爲如果我改變序列會發生什麼,並且在那一刻其他連接會生成下一個值? – VAAA

+0

是的,你是對的,最好是保持原樣。 –

回答

-3

回滾語句以下述方式用於取消一個完整的事務:

BEGIN TRANSACTION 
... 
SQL Statement(s) 

... 
ROLLBACK TRANSACTION 

回滾命令也可以用於取消交易的一部分以下述方式:

BEGIN TRANSACTION 
... 
SQL Statement(s) 

SAVE TRANSACTION savepoint_name 

SQL Statement(s) 

ROLLBACK TRANSACTION savepoint_name 
+0

不完全確定你理解了這個問題 –

1

聲明一個表,存儲所有序列號,然後使用如下所示的語句:

聲明 @SequenceNo int

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

這裏單個語句增加值,分配給變量並更新數據庫表,以保證其原子動作。由於它是一個簡單的數據庫更新操作,它在數據庫事務中發揮作用如果事務回滾,則SequenceNo字段值將恢復爲其較早的值。

只有catch是下一個事務,需要下一個相同序列名的值必須等到第一個事務由於行級鎖定而被提交或回滾。在DB序列的情況下,不會鎖定序列,因此它永遠不會阻止需要下一個值的其他事務。

在我們的情況下,我們根本不能有漏洞,並且需要併發保護,所以我們使用上面的方法,它對我們來說工作得很好。

+0

你必須非常小心地處理序列表。它們可能會成爲高容量系統的主要瓶頸,如果您對如何檢索和更新值不小心,可以在呼叫應用程序中獲取重複項。 – alroc