【问题标题】:Is it possible to set the ROWLOCK table hint from a transaction isolation level in MSSQL?是否可以从 MSSQL 中的事务隔离级别设置 ROWLOCK 表提示?
【发布时间】:2016-11-18 17:10:09
【问题描述】:

我正在为 MSSQL 驱动程序编写一个包装器,有人告诉我,我们需要确保每个传入的 UPDATE 或 DELETE 查询都包含 ROWLOCK 表提示。如果我可以在事务隔离级别而不是在每个现有查询中包含 WITH ROWLOCK 的某些糟糕的正则表达式来执行此操作,那就太棒了。现在,我要么是 SOL,要么只是对 ROWLOCK 实际做了什么感到非常困惑,所以如果我的理解有缺陷,请告诉我。

我相信我想要完成的是确保 UPDATE 或 DELETE 语句触及的任何行不仅在整个持续时间内与我的事务和我的事务引起的更改保持一致,而且重要的是防止受影响的行不会被任何其他事务同时触及。

可用的隔离级别是(来自https://msdn.microsoft.com/en-us/library/ms173763.aspx):

-- Syntax for SQL Server and Azure SQL Database  

SET TRANSACTION ISOLATION LEVEL  
    { READ UNCOMMITTED  
    | READ COMMITTED  
    | REPEATABLE READ  
    | SNAPSHOT  
    | SERIALIZABLE  
    }  
[ ; ] 

似乎 READ COMMITED 和 REPEATABLE READ 都有助于防止我接触的数据受到事务范围内任何外部变化的影响。但是,如果我正确解释了 ROWLOCK 的观点,我不仅想保留我范围内的数据状态,我还想防止其他人以任何形式接触我正在处理的数据,直到我我完全结束了,我的交易已经提交。

我相信并希望这里的问题是误解了 ROWLOCK 的意义。所以让我重申一下,任务是在每个 UPDATE 或 DELETE 语句中包含 ROWLOCK 表提示,但要从事务隔离级别执行此操作。我正在使用繁琐的 Node.js 驱动程序,但我认为这与这个问题无关。

【问题讨论】:

  • 你能详细说明一下这个we need to ensure that every incoming UPDATE or DELETE query contains the ROWLOCK table hint.
  • 也许说包括 ROWLOCK 表提示来自一个错误的沟通,我相信我们试图强调 ROWLOCK 超过任何其他类型的锁(页、表)。文档说“为 READ COMMITTED 或 REPEATABLE READ 获取的共享锁通常是行锁,但如果读取引用了页或表中的大量行,行锁可以升级为页锁或表锁。”我想强制它们始终是行锁。
  • 最重要的是,在这些事务级别中大量使用“READ”一词令人不安。我需要锁定这些行以进行写操作。
  • 我不确定我是否理解,您似乎也有些困惑,阅读此内容以获取有关 rowlock 的更多信息:stackoverflow.com/questions/3005973/…
  • 谢谢!现在阅读。这个帖子让我想知道这是否是一个好主意,但我将编辑上面的问题以澄清。

标签: sql sql-server database transactions tedious


【解决方案1】:

如果我清楚地理解您的问题,您似乎正在寻找 SNAPSHOT ISOLATION。它不执行行锁,但使用行版本控制。根据您的问题,由于性能原因,您似乎不希望对“读取”进行任何锁定,但希望保持写入操作的完整性。

快照隔离级别使用行版本控制来提供事务级别的读取一致性。读取操作不获取页锁或行锁,但使用 DML 语句进行行版本控制。

与 (rowlock) 一样,是一个提示,它指示数据库应该在行范围内保持锁定。这意味着数据库将避免将锁升级到块或表范围。这将让另一个查询同时读取不相关的行,而不必等待删除完成。

上面提到的行锁使用可以使用 SNAPSHOT ISOLATION 来实现,您将能够读取不相关的行。

【讨论】:

  • 完美,我现在要检查一下,但听起来这可能是我需要的。谢谢!
  • 那么我有一个跟进,如果我使用 SNAPSHOT ISOLATION 进行写操作意味着没有行被锁定,这是否意味着没有死锁的机会?
  • @PauloBlack,您可以阅读msdn.microsoft.com/en-us/library/tcbchxcb(v=vs.110).aspx 这大大降低了复杂查询出现死锁的可能性
  • 完美,这正是我所需要的。再次感谢您。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-20
  • 2011-12-17
  • 1970-01-01
  • 2020-11-23
  • 2012-04-22
相关资源
最近更新 更多