2012-12-05 43 views
2

我們有一張用於生成唯一數字鍵的表格。這些鍵然後在其他表中用作PrimaryKey。表結構是這樣的:SQL Server如何處理UPDATE事務?

TableName  VARCHAR 
CurrentKey INT 

所以我們的數據在此表像

TableName Customers 
CurrentKey 400 

所以,當我們需要爲表Customers下一個主鍵,我們從這個表,其中TableNameCustomersCurrentKey,它會給我們400我們增加(400 + 1)它,我們也更新表中的這個關鍵。所以我們的CurrentKey現在是401。

我們爲此目的而使用的SQL是:

SQL1:

DECLARE @CurrentKey INT 
UPDATE myTable 
SET @CurrentKey = CurrentKey = CurrentKey + 1 
WHERE TableName = @TableName 

我的問題是,我們是否需要鎖定表,以便項可能不如果多個用戶調用複製這是在同一時間?我確信,SQL Server將不允許重複的數據,但我不知道如何...查詢與表鎖:

SQL2

BEGIN TRANSACTION 
    DECLARE @CurrentKey INT 
    UPDATE myTable WITH (TABLOCKX) 
    SET @CurrentKey = CurrentKey = CurrentKey + 1 
    WHERE TableName = @TableName 
END TRANSACTION 

可有人請解釋一下SQL Server如何處理UPDATE電話?

+3

你應該真的把它留給SQL Server來處理連續的數字,通過使用'INT IDENTITY'列類型。 **不要試圖自己做這件事!**有很多方法可以失敗...... –

+2

敢問我爲什麼要重新發明'IDENTITY'列?另外爲什麼你會集中保留一個當前值的表格?浪費時間,可能是錯誤的,並且不如直接查詢表格準確。 – Bridge

+0

數據庫超過12歲,我不允許更改舊的邏輯! –

回答

1

每個SQL語句都在事務中運行,並且update語句始終使用鎖來保護其更新。 SQL Server不允許讀取一半修改的行(對於大於8k的數據,有一些例外)。

您的第一條語句應該沒問題。