2016-01-07 52 views
0

兩個SP正在一個接一個地執行,另一個則被第一個阻塞。他們都試圖更新同一張表。兩個SP的表現如下由另一個事務阻塞的sql服務器更新,更新中的併發性

  1. CREATE PROCEDURE [DBO] [SP1]
    開始

    SET TRANSACTION ISOLATION級快照。
    BEGIN TRANSACTION ImpSchd

    更新表t1 .......... ............................ .... //更新 一組[N1,N2 ... N100]記錄

    COMMIT TRANSACTION ImpSchd
    SET TRANSACTION ISOLATION LEVEL READ COMMITTED;

    END

2.

CREATE PROCEDURE [DBO]。[SP2]

開始

更新表t1 ....... ... ................................ //更新 一組[n101,n102 .... .n200]記錄

END

SP1時,正在運行的快照隔離級爲什麼會阻止SP2我的問題是(N兩者都更新不同的記錄集)?

如果我同時運行兩個不同的記錄集的第一個sp它 完美的作品。

我該如何克服這種情況?

如果使用快照級別隔離來爲每個sp更新同一個表,那麼它將是一個更大的更改。

如果兩個sp必須更新表中的相同記錄,我應該如何處理(兩個sp將更新不同的列)?

回答

0

隔離級別只是爲了不阻止選擇,所以任何DML都不會受到隔離級別的影響。在這種情況下,更新需要對錶,頁面進行IX鎖定,然後對行進行xlock更新。由於您正在批量更新,表本身可能已經鎖定,因爲鎖定升級。希望這有助於

+0

然後當我運行sp1的兩個大型記錄集,這是如何得到成功沒有任何阻塞? –

+0

你能否澄清兩套大記錄,他們是否從不同的表 – TheGameiswar

+0

沒有相同的表的不同記錄。 –