2016-09-18 43 views
0

假設我有三個存儲過程:ProcA,ProcB和ProcC。它們都使用遊標,具有分支(通過IF語句),並且全部執行SELECT/UPDATE/INSERT語句。TABLOCKX命令是否重要?

另外,在他們引用的每個表格上,他們都應用表格提示'TABLOCKX'。而且,這些存儲過程總是從事務中調用。

雖然我的擔心是,因爲這些過程使用遊標和分支,它們似乎鎖定表的順序可能很重要。例如,在表在存儲過程中使用的順序有所不同:

+--------+--------+--------------------+--------------------+ 
| ProcA | ProcB | ProcC (scenario 1) | ProcC (scenario 2) | 
+--------+--------+--------------------+--------------------+ 
| TableA | TableA | TableB    | TableD    | 
| TableB | TableC | TableC    | TableA    | 
| TableD | TableE | TableD    | TableC    | 
+--------+--------+--------------------+--------------------+ 

所以,如果PROCA和ProcC都開始在同一時間,將SQL服務器知道阻止ProcC直到PROCA完成,因爲ProcC 可能需要TableA(取決於分支的條件)?

如果SQL Server允許同時運行,那麼如果(方案2)到達ProcC,是不是會死鎖?由於ProcA獲得了TableA的鎖定,並且ProcC被授予了TableD的鎖定,現在ProcA需要在TableD上鎖定,並且ProcC需要在TableA上鎖定?

回答

1

您提出了兩種情況;我會依次回答每個問題。

首先,鎖定是在他們引用的資源被引用時獲得的,而不是以先發制人的方式。因此,要回答您的問題,調用ProcC將不會鎖定tableA,除非該邏輯達到執行對tableA的調用的點。

其次,你對死鎖的可能性是正確的。一般來說,如果您以相同的順序鎖定資源,則不會發生死鎖。相反,如果您的不是以相同的順序鎖定它們,則通過在代碼中放置地雷來違反了「日內瓦公約」。在這種情況下,如果您取出紅鯡魚,tableA和tableD在兩個過程之間以相反順序鎖定。所以,如果他們同時執行,他們有可能會陷入僵局。