3

我想问几个关于 SQL Server 锁定机制的问题

  1. 如果我没有在 SQL 语句中使用锁定提示,SQL Server 默认使用 PAGELOCK 提示。我对吗???如果是,那为什么?可能是由于管理太多锁的因素,这是我唯一认为的缺点,但如果还有其他问题,请告诉我。并告诉我是否可以更改此默认行为,如果它是合理的。

  2. 我正在编写一个服务器端应用程序,一个同步服务器(不使用同步框架),我已经在 C# 代码文件中编写了数据库查询并使用 ODBC 连接来执行它们。现在的问题是将默认锁定从 Page 更改为 Row 的最佳方法是牢记缺点(例如,在查询中添加锁定提示,这是我的计划)。

  3. 如果在没有事务范围的情况下执行 sql 查询(SELECT/DML)并且语句包含锁提示,那么将获取什么样的锁(例如共享、更新、独占)?并且在事务范围内,如果正在使用 ROWLOCK 提示,事务的隔离级别是否会影响锁定类型。

  4. 最后,如果有人能给我样本,我可以自己测试和体验上述所有场景(例如点网代码或 sql 脚本)

谢谢穆巴沙尔

4

2 回答 2

3
  1. 不会。它会根据需要锁定并升级锁定

  2. 让数据库引擎管理它

  3. 见第 2 点

  4. 见第 2 点

如果您想要特定和某些行为,例如队列或非阻塞(脏)读取,我只会使用锁定提示。

更一般地说,为什么您认为默认情况下数据库引擎无法执行您想要的操作?

于 2010-01-19T10:57:26.480 回答
3

默认锁定是行锁而不是页锁,尽管锁定机制的工作方式意味着您将锁定层次结构中的所有对象,例如读取单行将在表上放置共享锁,共享锁在页面,然后是行上的共享锁。

这使得请求表上的独占锁的操作知道它可能还没有接受它,因为存在共享锁(否则它必须检查每个页面/行是否有锁。)

但是,如果您为单个查询发出太多锁,它会执行锁升级,这会降低锁的粒度——因此它管理的锁更少。这可以使用跟踪标志关闭,但我不会考虑。

在您知道您实际上有一个锁定/锁定升级问题之前,您可能会过早地优化一个不存在的问题。

于 2010-01-19T10:59:59.140 回答