假設我有三個存儲過程: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上鎖定?