我正在尝试优化我的查询执行时间使用最低锁定级别(Rowlock)但在SQL分析器中跟踪时不会生效“更高的锁定级别(IX)”,
我的情景:
dbo.Students
和dbo.University
dbo.Students
有University
表查询
INSERT INTO dbo.Students WITH (ROWLOCK) (UniversityId, StudentName)
当sql配置文件中的跟踪锁定
时Student
表授予IX(意图独占)University
表授予sch_s(架构稳定)并且在释放这两个锁之前授予并释放了许多Page和Key锁。
任何人都可以帮助我只在学生表中授予行锁吗?
答案 0 :(得分:1)
行为描述
很有可能,FOREIGN KEY
表上定义的这两个表之间存在dbo.Students
约束:
ALTER TABLE dbo.Students
...
[ADD CONSTRAINT constraint_name]
FOREIGN KEY (UniversityId)
REFERENCES dbo.University (UniversityId)
很可能,此约束已启用(请参阅sys.foreign_keys.is_disabled
),SQL Server“强制”检查此完整性约束:
当有人在dbo中插入一行时,非空@UniversityId
的学生会检查uid
列中是否已存在dbo.University.UniversityId
。
这意味着SQL Server必须以某种方式锁定与dbo.University.UniversityId
列关联的唯一索引的某些键/记录(外键必须引用一个或多个列,这些列是唯一索引的键)。
注意:据我记得来自SQL Server开发团队的前成员的评论,SQL Server使用Serializable隔离级别进行此类检查(我没有任何参考此信息)。
<强>问题强>
任何人都可以帮助我只在学生表中授予行锁吗?
“解决方案”(不是)
基本上你想避免锁定dbo.University表。 有一个解决方案(未经测试):删除外键约束但不推荐使用。