2016-11-18 64 views
2

我正在写一个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驱动程序,但我认为这与此问题无关。

+2

你可否详细说明一下'我们需要确保每个传入的UPDATE或DELETE查询都包含ROWLOCK表提示。' – TheGameiswar

+0

也许有人说ROWLOCK表提示来自沟通不畅,我相信我们试图强调ROWLOCK超过任何其他类型的锁(页面,表格)。该文档说:“为READ COMMITTED或REPEATABLE READ获取的共享锁通常是行锁,尽管如果页面或表中的大量行被读取引用,行锁可以升级为页或表锁。” 我想强制他们总是行锁。 –

+0

最重要的是,在这些交易层面大量使用单词“READ”令人不安。我需要将这些行锁定以进行写入操作。 –

回答

1

如果我明白你的问题,看起来你正在寻找SNAPSHOT ISOLATION。它不会执行行锁定,而是使用行版本控制。根据你的问题,它看起来像你不希望因为性能而对“读”有任何锁定,但想要保持写操作的完整性。

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

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

上面提到的使用rowlock可以使用SNAPSHOT ISOLATION来实现,在这里你可以读取不相关的行。

+0

完美,我现在要检查一下,但听起来这可能是我需要的。谢谢! –

+0

那么我有一个后续,如果我使用SNAPSHOT ISOLATION写入操作意味着没有行被锁定,这是否意味着没有死锁的机会? –

+0

@PauloBlack,你可以阅读https://msdn.microsoft.com/en-us/library/tcbchxcb(v=vs.110).aspx 这显着降低了复杂查询死锁的可能性 –

相关问题