Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/87.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 理解诺洛克的暗示_Sql_Sql Server_Transaction Isolation_Nolock - Fatal编程技术网

Sql 理解诺洛克的暗示

Sql 理解诺洛克的暗示,sql,sql-server,transaction-isolation,nolock,Sql,Sql Server,Transaction Isolation,Nolock,假设我有一个有1000000行的表,在这个表上运行一个SELECT*fromtablename,大约需要10秒钟才能返回数据 如果没有NOLOCK语句(将脏读的问题放在一边),这个查询是否会将表锁定10秒钟,这意味着没有其他进程可以读取或写入表 DBA经常通知我,当查询实时数据以诊断数据问题时,我应该使用NOLOCK来确保我不会锁定可能会给用户带来问题的表。这是真的吗?在请求所有数据时,您的查询将尝试获取表级锁。因此,是的,它将在查询和所有其他试图获取该表上的独占锁的进程的持续时间内保持,并将其

假设我有一个有1000000行的表,在这个表上运行一个
SELECT*fromtablename
,大约需要10秒钟才能返回数据

如果没有NOLOCK语句(将脏读的问题放在一边),这个查询是否会将表锁定10秒钟,这意味着没有其他进程可以读取或写入表


DBA经常通知我,当查询实时数据以诊断数据问题时,我应该使用NOLOCK来确保我不会锁定可能会给用户带来问题的表。这是真的吗?

在请求所有数据时,您的查询将尝试获取表级锁。因此,是的,它将在查询和所有其他试图获取该表上的独占锁的进程的持续时间内保持,并将其置于等待队列上。同时尝试从该表读取的进程将不会被阻止

在实时系统上执行的任何诊断都应小心,使用NOLOCK提示将允许您查看数据,而不会为用户造成任何争用


编辑:如上所述,更新锁与共享锁兼容。因此不会被读取进程阻塞。

在请求所有数据时,您的查询将尝试获取表级锁。因此,是的,它将在查询和所有其他试图获取该表上的独占锁的进程的持续时间内保持,并将其置于等待队列上。同时尝试从该表读取的进程将不会被阻止

在实时系统上执行的任何诊断都应小心,使用NOLOCK提示将允许您查看数据,而不会为用户造成任何争用


编辑:如上所述,更新锁与共享锁兼容。因此不会被读取进程阻止。

即使使用
NOLOCK
,SQL Server也可以选择覆盖并获得锁。出于某种原因,它被称为
QUERY**HINT**
。避免锁定的可靠方法是在会话开始时使用
设置事务隔离级别READ UNCOMMITTED

即使使用
NOLOCK
,SQL Server也可以选择覆盖并获取锁定。出于某种原因,它被称为
QUERY**HINT**
。避免锁定的可靠方法是在会话开始时使用
设置事务隔离级别READ UNCOMMITTED

表提示
NOLOCK
将导致不为相关表使用共享锁定;与
READUNCOMMITTED
隔离级别相同,但这一次不适用于单个表,而是适用于涉及的所有内容。因此,答案是‘不,它不会锁定表’。请注意,即使使用readuncommitted,可能的模式锁仍将保持

不请求共享锁读取操作可能会读取脏数据(已更新但尚未提交)和不存在的数据(已更新但已回滚),在任何情况下事务性不一致,甚至可能会跳过整个页面(如果页面拆分与读取操作同时发生)

指定
NOLOCK
READUNCOMMITTED
不是一个好做法。当然,它会更快。确保你意识到后果


此外,根据docs的说法,更新和删除语句中对这些提示的支持将在将来的版本中被删除。

表提示将导致所讨论的表没有共享锁;与
READUNCOMMITTED
隔离级别相同,但这一次不适用于单个表,而是适用于涉及的所有内容。因此,答案是‘不,它不会锁定表’。请注意,即使使用readuncommitted,可能的模式锁仍将保持

不请求共享锁读取操作可能会读取脏数据(已更新但尚未提交)和不存在的数据(已更新但已回滚),在任何情况下事务性不一致,甚至可能会跳过整个页面(如果页面拆分与读取操作同时发生)

指定
NOLOCK
READUNCOMMITTED
不是一个好做法。当然,它会更快。确保你意识到后果


此外,据docs称,更新和删除语句中对这些提示的支持将在将来的版本中删除。

这是一个经典的“视情况而定”问题!另请参见:这是一个经典的“视情况而定”问题!另见:谢谢。我读到了关于这件事的相互矛盾的东西。一些博客说锁一次应用一行,然后立即释放——其他人似乎说所有的行都被锁定了!锁的创建和释放方式取决于许多因素。假设您使用的是SQL Server或Sybase,并且您的查询在读取提交的隔离级别中运行,则在查询期间将保留锁。由于查询了整个表,很可能会获得表锁。如果SQL Server无法获取表级锁,它将开始创建行级锁,同时定期尝试获取表级锁。如果它能够升级到表级锁,那么所有行级锁将立即释放。更新锁实际上与共享锁兼容。谢谢。我读到了关于这件事的相互矛盾的东西。一些博客说锁一次应用一行,然后立即释放——其他人似乎说所有的行都被锁定了!锁的创建和释放方式取决于许多因素。假设您使用的是SQL Server或Sybase,并且您的查询在读取提交的隔离级别中运行,则在查询期间将保留锁。由于查询了整个表,很可能会获得表锁。如果SQL Server无法获取表级锁,它将开始创建行级锁,同时定期尝试获取表级锁