我需要使用c#在SQL Server 2008中原子地讀取和增加一個值。在SQL Server中讀取和增加int值
例如,我必須插入「lot」的項目,爲此我需要最後一批的編號並確保沒有其他人獲得此編號。
所以我只有最後一個批號的表,並找到一種方法來獲取和更新數字只有一步。
我該怎麼做?
我需要使用c#在SQL Server 2008中原子地讀取和增加一個值。在SQL Server中讀取和增加int值
例如,我必須插入「lot」的項目,爲此我需要最後一批的編號並確保沒有其他人獲得此編號。
所以我只有最後一個批號的表,並找到一種方法來獲取和更新數字只有一步。
我該怎麼做?
最簡單的方法是隻更改表格,以便批號是identity
字段,並自動自增。那麼你不必擔心代碼中的增量。
批號是連續的嗎?爲什麼不使用identity
?這在併發性方面更好,否則你需要阻止併發插入嘗試,以防它們回滾並在序列中留下空隙。
如果絕對是必需的,但是你可以做
CREATE TABLE dbo.Sequence
(
OneRow CHAR(1) DEFAULT('X') PRIMARY KEY CHECK(OneRow = 'X'),
val INT
)
插入一行與初始種子。
INSERT INTO dbo.Sequence
(val)
VALUES (1)
然後分配範圍足夠大的尺寸爲您的插入(調用它顯然是同一個事務)
CREATE PROC dbo.GetSequence
@val AS int OUTPUT,
@n as int =1
AS
UPDATE dbo.Sequence
SET @val = val = (val + @n);
請謹慎對待這種「古怪的更新」語法。我在上面的第一個鏈接問題的評論導致更多的信息... –
@Aaron - 這是記錄爲一行AFAIK工作。 –
記錄在哪裏?並持續到什麼版本?我不是說這是一個糟糕的解決方案,它只是沒有通過我的面向未來的測試。 –
是至關重要的是,批號是連續的?爲什麼不使用「身份證」? –
也許古怪的更新方法在這裏http://stackoverflow.com/questions/7184410/sql-server-update-mytable-set-col1-value-col2-col1或這裏http://stackoverflow.com/questions/6653962/ ms-sql-query-update-record-retrieve-via-stored-procedure可以提供幫助。 –