我正在为MSSQL驱动程序编写一个包装器,我被告知我们需要确保每个传入的UPDATE或DELETE查询都包含ROWLOCK表提示。如果我能在事务隔离级别执行此操作,而不是包含WITH ROWLOCK的每个现有查询的某些whackjob正则表达式,那将是非常棒的。现在,我要么是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表提示,但是从事务隔离级别执行此操作。我正在使用Tedious Node.js驱动程序,但我认为这与此问题无关。
答案 0 :(得分:1)
如果我清楚地理解你的问题,看起来你正在寻找SNAPSHOT ISOLATION。它不执行行锁定但使用行版本控制。根据您的问题,看起来您不希望因“性能”而对“读取”进行任何锁定,但希望保持写入操作的完整性。
快照隔离级别使用行版本控制来提供事务级读取一致性。读操作不获取页锁或行锁,但使用DML语句进行行版本控制。
与(rowlock)一样,提示指示数据库应该在行范围内保持锁定。这意味着数据库将避免将锁升级到块或表范围。这将让另一个查询同时读取不相关的行,而不必等待删除完成。
使用SNAPSHOT ISOLATION可以实现上述行锁的使用,您可以在其中读取不相关的行。