sql-server – 在SQL服务器和数据库锁中使用外键

我一直在使用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
}

现在到了问题,
当我在更新MyFK的MyTable1上执行一些批量更新操作时,
并且同时对MyTable2执行insert语句,我们挂起直到发生超时或更新完成并释放锁.

据我所知,当插入具有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以克服我的问题?

最佳答案 为了防止
page asasfrob发现,它给出的答案是:

Define the primary key on the parent table (TableA) as a non-clustered
index. Once you do that, the issue won’t occur since the look-up will
occur against the non-clustered index and that won’t be in a locked
state since the PK column is not being modified.

点赞