[英]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.