2012-05-18 39 views
1

我正在尋找一些有關使用SQL Server處理數據庫內數據的最佳方法的指導。多個更新語句/瞬態表/避免鎖定

基本上我有一系列加載數據的瞬態表,然後對它們執行一系列更新語句。這些系列更新語句的多個實例針對同一個表運行,但每個實例只更新具有特定標識符(譜系)的行。 我期待能夠自信地避免實例同時運行時出現任何鎖定問題/死鎖。

兩個想法我對這個如下:

  1. 所有更新語句包含的提示ROWLOCK,使頁鎖不會發生覆蓋不同的譜系。
  2. 更改隔離級別 - 髒讀永遠不會發生。 任何人都可以擺脫對這種情況的最佳方法嗎?
+0

你能否爲表提供特定的模式/ DDL - 特別是PK,索引等? – StuartLC

+0

好吧,假設你有一個表,它是id,lineageid,col1,col2等。更新語句對col1和col2等作用於特定的lineageid。表中存在多套lineageid。我們希望確保不會發生鎖定。 – dandcg

回答

1

假設你的表看起來是這樣的:

CREATE TABLE MyTable 
( 
    ID INT IDENTITY(1,1), 
    LineageId INT NOT NULL, -- FK to Lineage 
    Col1 ... 
    Col2 ... 

    PRIMARY KEY CLUSTERED(ID), 
    FOREIGN KEY LineageId REFERENCES Lineage(LineageId) 
) 
  1. 建議您在表中將聚集索引LineageId(但是見下文)。這應該保證,如果SQL將行鎖升級到頁鎖,則最少的頁面會更新。這樣做的缺點是LineageId不是唯一的,因此SQL將添加一個唯一標識符。因此,在更改集羣之前,如果您的PK正在增加,並且您發現表中的幾乎所有行都已經由LineageId連續排列(例如,如果數據是通過單個線程批處理作業插入此表中的),那麼通過遞增代理鍵將是優選的,因爲這避免了分離器(更好的狹窄)。

  2. ROWLOCK提示可能會有幫助,雖然這不能保證。 http://social.msdn.microsoft.com/Forums/en/sqldatabaseengine/thread/60238304-04e8-4f98-84d1-3ddf1ed786a9

  3. 設置隔離級別READ UNCOMMITTEDSNAPSHOT或使用(NOLOCK)提示將需要做其他的併發查詢,以避免它們在你LineageId更新你的表封鎖。這將是一個激烈的措施,而未提交的內容可能會導致完整性問題。

+0

使用SNAPSHOT閱讀UNCOMMITTED或READ COMMITT似乎是前進之路,只需進行一些額外的手動檢查以確保完整性。 – dandcg