默认锁定设置SQL Server 2008 R2

我正在寻找这个答案,但我无法找到我的问题的确切答案。

问题是,我实际上有一些SQL问题,由于我的数据库上的事务锁定。 我想知道,默认情况下,SELECT语句是否锁定了一个表? 我发现如果我使用HOLDLOCK或TABLOCK之类的表提示,select将锁定表直到它完成,但是当没有指定表提示时,SQL的行为是什么? 联合会影响它的行为?

还有一个问题,描述了以下情形:我在.NET应用程序中启动一个连接和事务,并将它们绑定到一个命令,该命令运行一个只包含SELECT语句的存储过程。 选择是否由于交易而锁定表格?

感谢您的关注。

最好的祝福。


我想知道,默认情况下,SELECT语句是否锁定了一个表?

是。 所有事务创建锁。 并非所有的锁都被阻塞 (共享锁通常不是),但所有与数据库交互的事务都会创建锁。 锁定是查询引擎如何跟踪它正在写入或正在读取的内容。

即使你指定了NOLOCK或者READUNCOMMITTED(你通常不想这样做),你仍然会得到锁,因为数据需要保持一致,即使它很脏,并且锁确保它是。 也就是说,即使它返回未提交的记录(脏),也不存在不完整或部分更改(不一致)的记录。

我发现如果我使用HOLDLOCK或TABLOCK这样的表提示,select会锁定表[直到]完成,但是当没有指定表提示时,SQL的行为是什么?

没有默认锁提示。 查询引擎确定它需要动态。 根据查询,SELECT将倾向于共享或范围键范围。 INSERT / UPDATE / DELETE将倾向于独占锁。 系统通常会支持最小粒度的行锁,但如果它认为应该将它们升级到页锁或表锁。 注意:它们被称为“锁定提示”而不是“锁定命令”,因为查询引擎会在必要时忽略它们。

与默认锁提示最接近的是事务隔离级别,它通常控制事务中查询的功能,并且默认为READ COMMITTED。

动态锁定,锁粒度,锁升级和锁层次都在我已经链接到注释中的MS文档中解释。

锁定系统存在巨大的细微差别和复杂性。 在不同系统上的相同查询可能会得到不同的锁,因为表大小不同或内存压力不同。

您还可以使用ALLOW_SNAPSHOT_ISOLATION和READ_COMMITTED_SNAPSHOT数据库选项来显着修改锁定系统,但我不会轻易做出这些更改。 但是,它确实使数据库的表现更像Oracle。

联合会影响它的行为?

非常非常。 要进行连接,查询引擎通常必须扫描索引或实际的表。 索引像表一样受到锁定,所以我希望Shared或RangeS-S锁定出现在数据库中的对象上。

还有一个问题,描述了以下情形:我在.NET应用程序中启动一个连接和事务,并将它们绑定到一个命令,该命令运行一个只包含SELECT语句的存储过程。 选择是否由于交易而锁定表格?

是。

如果您使用的是System.Data.SqlClient.SqlTransaction,则默认隔离级别为ReadCommitted,该级别(不确定地)映射到READ COMMITTED隔离级别。 但是,如果您使用的是System.Transactions,那么您将默认使用Serializable,它映射到SERIALIZEABLE(最严格的隔离级别)。

链接地址: http://www.djcxy.com/p/5623.html

上一篇: Default lock settings SQL Server 2008 R2

下一篇: Primary key conflict even when TABLOCKX and HOLDLOCK hints