我使用 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/en-us/library/ms184286%28v=sql.105%29.aspx
将索引上的锁更改为基于行而不是基于页面 http://msdn.microsoft.com/en-us/library/ms189076%28v=sql.105%29.aspx
这两种解决方案都会导致我陷入僵局和表现不佳。
当我删除 FK 时,一切正常,但存在数据损坏的风险。
问题:
- 关于在哪里使用 FK 和在哪里不使用,是否有任何推荐的规则集?
- 除了删除 FK 来解决我的问题之外,您能否提供任何其他解决方案?