gpt4 book ai didi

sql-server - 向SQL Server插入数据会锁定整个表吗?

转载 作者:行者123 更新时间:2023-12-01 17:57:14 25 4
gpt4 key购买 nike

我正在使用Entity Framework ,我正在将记录插入到我们的数据库中,其中包括 blob 字段。 Blob 字段最多可以包含 5 MB 的数据。

向该表插入一条记录时,是否会锁定整个表?

因此,如果您从表中查询任何数据,它会阻塞直到插入完成(我意识到有很多方法可以解决这个问题,但我是在默认情况下讨论的)?

需要多长时间才会导致死锁?该时间取决于服务器上的负载量,例如如果负载不多的话,会不会花更长的时间导致死锁?

有没有办法监视并查看在任何特定时间锁定的内容?

如果每个线程都对单个表进行查询,是否会出现阻塞的情况?那么,是不是只有当您的查询具有联接并且作用于多个表时才会发生死锁?

这是考虑到我的大部分代码只是一堆选择语句,而不是一堆长时间运行的事务或类似的东西。

最佳答案

天哪,你这里有很多问题,呵呵。以下是一些答案:

向该表插入一条记录时,是否会锁定整个表?

默认情况下不是,但如果您使用 TABLOCK 提示或者正在执行某些类型的批量加载操作,则可以。

因此,如果您从表中查询任何数据,它会阻塞直到插入完成(我意识到有很多方法可以解决这个问题,但我是在默认情况下讨论的)?

这个有点棘手。如果有人试图从您已锁定的表中的页面中选择数据,那么是的,您将阻止他们。您可以使用 select 语句上的 NOLOCK 提示或使用读提交快照隔离等方法来解决此问题。有关隔离级别如何工作的起点,请查看 Kendra Little's isolation levels poster .

需要多长时间才会导致死锁?该时间取决于服务器上的负载量,例如如果负载不大,会不会花更长的时间导致死锁?

死锁不是基于时间 - 它们基于依赖关系。假设我们有这样的情况:

  • 查询 A 持有一堆锁,为了完成查询,他需要查询 B 锁定的内容
  • 查询 B 也持有一堆锁,为了完成他的查询,他需要查询 A 锁定的内容

两个查询都无法前进(想想墨西哥对峙),因此 SQL Server 称其为平局,将某人的查询放在后面,释放他的锁,并让另一个查询继续进行。 SQL Server 根据回滚成本较低的情况来选择受害者。如果您想变得更奇特,您可以在特定查询上使用 SET DEADLOCK_PRIORITY LOW 将目标绘制在其背面,SQL Server 将首先射击它们。

有没有办法监控并查看在任何特定时间锁定的内容?

当然 - 您可以像 sys.dm_tran_locks 一样查询动态管理 View (DMV),但最简单的方法是使用 Adam Machanic's free sp_WhoIsActive stored proc 。它是 sp_who 的一个非常巧妙的替代品,你可以像这样调用:

sp_WhoIsActive @get_locks = 1

对于每个正在运行的查询,您将获得一个小的 XML,描述它所持有的所有锁。还有一个阻止列,因此您可以看到谁阻止了谁。要解释所持有的锁,您需要检查 Books Online descriptions of lock types .

如果每个线程都对单个表进行查询,是否会出现阻塞的情况?那么,是不是只有当您的查询具有联接并且作用于多个表时才会发生死锁?

不管你信不信,a single query can actually deadlock itself是的,查询可能仅在一张表上发生死锁。要了解有关死锁的更多信息,请查看 The Difficulty with Deadlocks by Jeremiah Peschka .

关于sql-server - 向SQL Server插入数据会锁定整个表吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7395915/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com