是否可以从 MSSQL 中的事务隔离级别设置 ROWLOCK table 提示?
Is it possible to set the ROWLOCK table hint from a transaction isolation level in MSSQL?
我正在为 MSSQL 驱动程序编写包装器,有人告诉我我们需要确保每个传入的 UPDATE 或 DELETE 查询都包含 ROWLOCK table 提示。如果我可以在事务隔离级别而不是每个现有查询的一些 whackjob 正则表达式来包含 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 table 提示,但要从事务隔离级别进行。我正在使用 Tedious Node.js 驱动程序,但我认为这与这个问题无关。
如果我清楚地理解你的问题,那么你似乎正在寻找 SNAPSHOT ISOLATION。它不执行行锁,但使用行版本控制。根据您的问题,由于性能原因,您似乎不想对 "Read" 进行任何锁定,但希望保持写操作的完整性。
快照隔离级别使用行版本控制来提供事务级别的读取一致性。读取操作不获取页锁或行锁,但使用 DML 语句进行行版本控制。
与 (rowlock) 一样,它是一个提示,它指示数据库应该在行范围内保持锁定。这意味着数据库将避免将锁升级到块或 table 范围。这将使另一个查询同时读取不相关的行,而不必等待删除完成。
上述行锁的使用可以使用 SNAPSHOT ISOLATION 实现,您将能够读取不相关的行。
我正在为 MSSQL 驱动程序编写包装器,有人告诉我我们需要确保每个传入的 UPDATE 或 DELETE 查询都包含 ROWLOCK table 提示。如果我可以在事务隔离级别而不是每个现有查询的一些 whackjob 正则表达式来包含 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 table 提示,但要从事务隔离级别进行。我正在使用 Tedious Node.js 驱动程序,但我认为这与这个问题无关。
如果我清楚地理解你的问题,那么你似乎正在寻找 SNAPSHOT ISOLATION。它不执行行锁,但使用行版本控制。根据您的问题,由于性能原因,您似乎不想对 "Read" 进行任何锁定,但希望保持写操作的完整性。
快照隔离级别使用行版本控制来提供事务级别的读取一致性。读取操作不获取页锁或行锁,但使用 DML 语句进行行版本控制。
与 (rowlock) 一样,它是一个提示,它指示数据库应该在行范围内保持锁定。这意味着数据库将避免将锁升级到块或 table 范围。这将使另一个查询同时读取不相关的行,而不必等待删除完成。
上述行锁的使用可以使用 SNAPSHOT ISOLATION 实现,您将能够读取不相关的行。