Sql server 在SQL server和DB锁中使用外键
我已经使用SQLServer很长时间了,当表之间存在逻辑连接时,我总是使用FKs和索引 例如:Sql server 在SQL server和DB锁中使用外键,sql-server,sql-server-2008-r2,foreign-keys,database-deadlocks,Sql Server,Sql Server 2008 R2,Foreign Keys,Database Deadlocks,我已经使用SQLServer很长时间了,当表之间存在逻辑连接时,我总是使用FKs和索引 例如: 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 BIGIN
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的insert语句的同时,我们将挂起,直到出现超时或更新完成并释放锁
据我所知,在插入到具有FK的表时,DB引擎需要在相关表上获得锁以验证FK,这就是问题的根源
我试图解决问题的事情:
- 已删除表上的锁升级选项
- 将索引上的锁更改为基于行而不是基于页
如果没有批量更新代码,那就很难了,因为我不明白为什么你会首先遇到这个问题。加快批量查询的一个常见技巧是先删除密钥,然后再将其放回(带有检查)。我们系统中的一个集成模块用于从外部源导入数据。当我们这样做时,我们使用SQLBulkCopy将数据加载到数据库中的一个表中,对其执行一些select操作,然后执行诸如更新MyTable1 Set MyFK=T2.ID From MyTable1 Internal Join MyTestable on…这样做时,数据库是否已充分使用?根据你的描述,我不明白锁是从哪里来的。我应该很高兴地跳过,除非你做了一些不合拍的事情,否则不会把自己锁在外面。这篇文章完美地代表了我的处境。现在我已经找到了,我可以尝试他们建议的解决方案。如果我发现任何值得一提的东西,我会更新的。啊,现在我明白了。我想你是说批量更新将自己锁定,因为没有提到在使用db的地方进行批量更新。一般来说,我尝试在单用户模式下做这类事情。另一种选择可能是将更新分成可管理的部分,以减少长期冲突的可能性。