我正在写一个MSSQL驱动程序的包装,我被告知我们需要确保每个传入的UPDATE或DELETE查询都包含ROWLOCK表提示。如果我可以在事务隔离级别执行此操作,而不是每个包含WITH ROWLOCK的现有查询的某个whackjob正则表达式,那将是太棒了。现在,我是SOL或者对于ROWLOCK实际上做了什么感到困惑,所以请让我知道我的理解是否有缺陷。是否可以从MSSQL中的事务隔离级别设置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
}
[ ; ]
它好像同时读取COMMITED和可重复的阅读是防止受着在范围内的任何外部变化,我接触到有用的数据我的交易。然而,如果我正确地解释了ROWLOCK的观点,我不只是想保留我的范围内的数据状态,我想阻止其他人触摸我以任何形式处理的数据,直到我我已经完全结束了,我的交易已经完成。
我确信并希望这里的问题会误解ROWLOCK的含义。因此,让我重申,任务是在每个UPDATE或DELETE语句中包含ROWLOCK表提示,但是从事务隔离级别执行此操作。我正在使用Tedious Node.js驱动程序,但我认为这与此问题无关。
你可否详细说明一下'我们需要确保每个传入的UPDATE或DELETE查询都包含ROWLOCK表提示。' – TheGameiswar
也许有人说ROWLOCK表提示来自沟通不畅,我相信我们试图强调ROWLOCK超过任何其他类型的锁(页面,表格)。该文档说:“为READ COMMITTED或REPEATABLE READ获取的共享锁通常是行锁,尽管如果页面或表中的大量行被读取引用,行锁可以升级为页或表锁。” 我想强制他们总是行锁。 –
最重要的是,在这些交易层面大量使用单词“READ”令人不安。我需要将这些行锁定以进行写入操作。 –