[英]Using foreign key in SQL server and DB locks
我已经使用SQL Server很长时间了,当表之间存在逻辑连接时,我总是使用FK和索引
例:
MyTable1
{
ID BIGINT IDENTITY (1, 1) NOT NULL,
SomeData NVARCHAR(255) NOT NULL,
MyFK BIGINT NULL -- this is a FK to MyTable2.ID
}
MyTable2
{
ID BIGINT IDENTITY (1, 1) NOT NULL,
SomeData NVARCHAR(255) NOT NULL
}
现在要解决的问题是,当我在MyTable1上执行一些批量更新操作以更新MyFK,同时对MyTable2执行插入语句时,我们会一直挂起,直到发生超时或更新完成并释放了锁。
据我所知,当插入具有FK的表时,数据库引擎需要获得相关表的锁以验证FK,这就是问题的根源。
我尝试解决的问题:
删除了表http://msdn.microsoft.com/zh-cn/library/ms184286%28v=sql.105%29.aspx上的锁升级选项
将索引上的锁定更改为基于行而不基于页面http://msdn.microsoft.com/zh-cn/library/ms189076%28v=sql.105%29.aspx
两种解决方案都导致我陷入僵局和性能不佳。
当我卸下FK时,一切正常,但存在数据损坏的风险。
问题:
万一asasfrob找到的页面出现故障,它给出的答案是:
将父表(TableA)上的主键定义为非聚集索引。 一旦执行此操作,就不会出现此问题,因为将针对非聚集索引进行查找,并且由于未修改PK列,因此不会处于锁定状态。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.