Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
被Readpast锁定的Sql表_Sql_Sql Server_Transactions_Locking - Fatal编程技术网

被Readpast锁定的Sql表

被Readpast锁定的Sql表,sql,sql-server,transactions,locking,Sql,Sql Server,Transactions,Locking,我有一个SQL视图。我在这个SQL视图中使用了readpass。因为我不想看到脏数据。但是SQLreadpass锁定了此SQL视图的表。我不想表锁定,我只想锁定行 哪种方法是正确的?问题似乎是隔离级别。如果使用sql server,则必须使用读取提交的快照。这规定您只能获取提交的数据。这也不会导致表锁定。但您必须在数据库级别启用它。您可以查找配置。 此外,readpast不是一个解决方案。它跳过锁定的行。因此,您会得到丢失的结果。当更新行时,您的select查询会忽略此行。但在读取提交隔离级别中

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


哪种方法是正确的?

问题似乎是隔离级别。如果使用sql server,则必须使用读取提交的快照。这规定您只能获取提交的数据。这也不会导致表锁定。但您必须在数据库级别启用它。您可以查找配置。 此外,readpast不是一个解决方案。它跳过锁定的行。因此,您会得到丢失的结果。当更新行时,您的select查询会忽略此行。但在读取提交隔离级别中,您会得到此行的提交版本,即使被另一个事务锁定,并且
此隔离级别不会锁定您的表。我假设您对事务使用默认隔离级别。如果您没有为事务设置隔离级别,则它将使用默认隔离级别,并且这是读取提交的。读取提交的快照仅在读取提交的隔离级别下工作,而不锁定。除此之外,例如可序列化隔离级别它将继续锁定。因此,您可以为调用视图的事务使用默认隔离级别。

当您从表中选择时,您仍然会在其上放置共享锁…但是如果您的表已锁定,并且您不希望在使用readpast的同时看到脏数据,则应确保您的表具有索引,然后设置页面锁定为off,行锁定为on。当然,您的查询应该在索引列上有where子句。。

SQL Server在查询中使用的锁取决于当前事务的所有操作,以及与视图的基础表和索引一起使用的实际查询。要获得完整答案,您必须在问题中包含所有这些信息。谢谢您的回答。我将分享我的疑问。但首先,我将尝试隔离级别。谢谢您的回答。我将尝试隔离级别。当使用读提交快照时,您必须小心tempdb。例如,如果并发事务太多,基本上tempdb磁盘必须在ssd中。您可以查看。