【发布时间】: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