Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 在SQL server和DB锁中使用外键_Sql Server_Sql Server 2008 R2_Foreign Keys_Database Deadlocks - Fatal编程技术网

Sql server 在SQL server和DB锁中使用外键

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

我已经使用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      BIGINT IDENTITY (1, 1)  NOT NULL,
    SomeData    NVARCHAR(255)       NOT NULL
}
现在来谈谈问题, 当我在MyTable1上执行一些批量更新操作来更新MyFK时, 在执行MyTable2的insert语句的同时,我们将挂起,直到出现超时或更新完成并释放锁

据我所知,在插入到具有FK的表时,DB引擎需要在相关表上获得锁以验证FK,这就是问题的根源

我试图解决问题的事情:

  • 已删除表上的锁升级选项

  • 将索引上的锁更改为基于行而不是基于页

这两种解决方案都会导致死锁和糟糕的性能

当我移除FK时,它运行良好,但存在数据损坏的风险

问题:

  • 是否有关于在何处使用FK和在何处不使用FK的推荐规则
  • 除了移除FK以克服我的问题之外,您能提供其他解决方案吗
  • 万一asasfrob发现的东西掉了,它给出的答案是:

    将父表(TableA)上的主键定义为非集群 指数一旦您这样做,问题就不会发生,因为将进行查找 发生在非聚集索引上,并且该索引不会处于锁定状态 状态,因为PK列未被修改


    如果没有批量更新代码,那就很难了,因为我不明白为什么你会首先遇到这个问题。加快批量查询的一个常见技巧是先删除密钥,然后再将其放回(带有检查)。我们系统中的一个集成模块用于从外部源导入数据。当我们这样做时,我们使用SQLBulkCopy将数据加载到数据库中的一个表中,对其执行一些select操作,然后执行诸如更新MyTable1 Set MyFK=T2.ID From MyTable1 Internal Join MyTestable on…这样做时,数据库是否已充分使用?根据你的描述,我不明白锁是从哪里来的。我应该很高兴地跳过,除非你做了一些不合拍的事情,否则不会把自己锁在外面。这篇文章完美地代表了我的处境。现在我已经找到了,我可以尝试他们建议的解决方案。如果我发现任何值得一提的东西,我会更新的。啊,现在我明白了。我想你是说批量更新将自己锁定,因为没有提到在使用db的地方进行批量更新。一般来说,我尝试在单用户模式下做这类事情。另一种选择可能是将更新分成可管理的部分,以减少长期冲突的可能性。