假设我有三个存储过程: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上锁定?