关于SQL Server锁定机制

时间:2010-01-19 10:47:04

标签: sql sql-server locking deadlock rowlocking

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

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

  2. 我正在编写服务器端应用程序,Sync Server(不使用同步框架),我在C#代码文件中编写了数据库查询,并使用ODBC连接来执行它们。现在问题是将页面之间的默认锁定更改为保持缺点的最佳方法是什么(例如,在查询中添加锁定提示这是我正在计划的内容)。

  3. 如果正在执行sql查询(SELECT / DML)而没有事务范围并且语句包含锁定提示然后将获取什么类型的锁(例如,共享,更新,独占),该怎么办? AND在事务范围内如果正在使用ROWLOCK提示,事务的隔离级别会对锁类型产生影响。

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

  5. 由于 Mubashar

2 个答案:

答案 0 :(得分:3)

  1. 没有。它会根据需要进行锁定,并根据需要升级锁定

  2. 让数据库引擎管理它

  3. 见第2点

  4. 见第2点

  5. 如果您需要特定和特定的行为,例如queues或非阻塞(脏)读取,我只会使用锁定提示。

    更一般地说,为什么你认为数据库引擎默认不能做你想做的事情?

答案 1 :(得分:3)

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

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

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

在您确定实际存在锁定/锁定升级问题之前,您可能会过早地优化不存在的问题。