由Readpast锁定的Sql表

时间:2019-04-12 18:26:11

标签: sql sql-server transactions locking

我有一个SQL视图。我在此SQL视图上使用READPAST。因为我不想看到脏数据。但是SQL READPAST锁定了此SQL View的表。我不想锁定表,我只想锁定行。

哪种方法正确?

2 个答案:

答案 0 :(得分:0)

问题似乎是隔离级别。如果使用sql server,则必须使用读取已提交的快照。这提供了您仅获取已提交的数据。这也不会导致表锁定。但是必须在数据库级别启用它。可以查看https://www.google.com/amp/s/www.red-gate.com/simple-talk/sql/performance/read-committed-snapshot-isolation-high-version_ghost_record_count/amp/进行配置。 同样,readpast不是解决方案,它会跳过锁定的行。因此,您会丢失结果。更新某行时,您的选择查询将忽略此行。但是在读取已提交隔离级别中,即使被另一个事务锁定,您也会获得该行的已提交版本。和 此隔离级别不会锁定您的表。我假设您对事务使用默认隔离级别。如果您未为事务设置隔离级别,则它将使用默认隔离级别并且已被读提交。提交隔离级别而不进行锁定。例如,在可序列化隔离级别中,它会继续锁定。因此,您可以对调用视图的事务使用默认隔离级别。

答案 1 :(得分:0)

从表中进行选择时,无论如何都要在其上放置共享锁...但是,如果表已被锁定并且不想使用readpast看到脏数据,则应确保表具有索引和然后将页面锁定设置为off,将行锁定设置为on ..当然,您的查询应该在索引列上具有where子句。 https://docs.microsoft.com/en-us/sql/t-sql/queries/hints-transact-sql-table?view=sql-server-2017