由Readpast锁定的Sql表

问题描述 投票:2回答:2

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

哪种方法正确?

sql sql-server transactions locking
2个回答
0
投票

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


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也不是一个解决方案。它会跳过锁定的行。所以你会得到缺失的结果。当一行更新时,你的选择查询会忽略这一行。但是在读提交的隔离级别,即使被另一个事务锁定,你也会获得该行的提交版本并且此隔离级别不会锁定您的表。我假设您使用事务的默认隔离级别。如果您没有为事务设置隔离级别,它使用默认隔离级别,这是读取commit.Read提交的快照只能在读取已提交的隔离级别而不进行锁定。除此之外,例如在可序列化隔离级别中,它继续锁定。因此,您可以使用默认隔离级别来调用视图的事务。

© www.soinside.com 2019 - 2024. All rights reserved.