2010-01-19 61 views
2

我想问一下关于SQL服务器,如果我不使用锁提示与SQL语句的锁定机制关于SQL Server的锁定机制

  1. 几个问题时,SQL Server默认使用PAGELOCK提示。我对吗???如果是,那为什么?可能是由于管理太多锁的原因,这是我作为缺点采取的唯一事情,但请让我知道是否有其他人。并告诉我,如果我们可以改变这种默认行为,如果它合理的话。我写了一个服务器端应用程序,一个同步服务器(不使用同步框架),我写了C#代码文件中的数据库查询,并使用ODBC连接执行它们。现在问题是什么是最好的方式来改变从页面到行的默认锁定记住缺点(例如,在查询中添加锁定提示,这是我的计划)。

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

  3. 最后,如果一些能够给我品尝,所以我可以测试所有上述情况我自己的经验(如点网代码或SQL脚本)

感谢 Mubashar

回答

2
  1. 不会。它锁定它认为合适的位置并根据需要升级锁

  2. 让数据库引擎管理它

  3. 看点二

  4. 看点二

,如果你想具体和特定行为,例如queues或非阻塞(脏)读我只用锁提示。

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

3

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

这使得在桌子上请求排它锁的动作就知道它可能不采取它,因为有一个共享锁存在(否则它会检查每一页/行的锁。)

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

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