插入语句中的SQL Server锁定提示不授予指定的锁定

时间:2016-03-27 15:03:43

标签: sql sql-server tsql optimization locking

我正在尝试优化我的查询执行时间使用最低锁定级别(Rowlock)但在SQL分析器中跟踪时不会生效“更高的锁定级别(IX)”,

我的情景:

  • 假设我有两个表dbo.Studentsdbo.University
  • dbo.StudentsUniversity
  • 的外键列

查询

INSERT INTO  dbo.Students WITH (ROWLOCK) (UniversityId, StudentName)

当sql配置文件中的跟踪锁定

  • Student表授予IX(意图独占)
  • University表授予sch_s(架构稳定)

并且在释放这两个锁之前授予并释放了许多Page和Key锁。

任何人都可以帮助我只在学生表中授予行锁吗?

1 个答案:

答案 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表。 有一个解决方案(未经测试):删除外键约束但不推荐使用。