Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/268.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
C# 选择查询阻塞数据库表_C#_Sql_.net_Sql Server - Fatal编程技术网

C# 选择查询阻塞数据库表

C# 选择查询阻塞数据库表,c#,sql,.net,sql-server,C#,Sql,.net,Sql Server,我们的生产设置是,我们有一个应用服务器,其中的应用程序连接到SQL server 2016数据库。在应用服务器上,有几个IIS应用程序在GMSA帐户下运行。GMSA帐户对数据库具有db_datawriter和db_datareader权限 我们的团队对同一SQL Server数据库具有db_datareader权限。出于生产支持的目的,我们需要这个 我们最近发生了一起事件,一名团队成员在其本地计算机上调用了SQL Server Management Studio上的查询: SELECT * FR

我们的生产设置是,我们有一个应用服务器,其中的应用程序连接到SQL server 2016数据库。在应用服务器上,有几个IIS应用程序在GMSA帐户下运行。GMSA帐户对数据库具有db_datawriter和db_datareader权限

我们的团队对同一SQL Server数据库具有db_datareader权限。出于生产支持的目的,我们需要这个

我们最近发生了一起事件,一名团队成员在其本地计算机上调用了SQL Server Management Studio上的查询:

SELECT * FROM [DatabaseA].[dbo].[TableA] order by CreateDt desc;
TableA大约有140万条记录,有多个blob类型的列。CreateDt是DATETIME2类型的列

我们已经为SQL Server数据库服务器配置了RedGate SQL监视器。这引发了一个长时间运行的查询警报,该警报运行了1738秒

同时,我们的一个web应用程序.NET 4.6专门向TableA插入新记录,但遇到了持续的查询超时错误:

Execution Timeout Expired.  The timeout period elapsed prior to completion of the operation or the server is not responding.
这些错误发生的时间几乎与1738秒完全相同。这让我相信它们是相互关联的

我的理解是,SELECT查询只会创建一个共享锁,不会阻止其他连接对此表的访问。我的理解正确吗


我的问题是db_datareader对团队成员安全吗?是否存在允许读取数据但绝对无法创建阻止行为的较低权限。

查询中存在SELECT*SELECT STAR通常会导致不使用索引和扫描表。 对于许多LOB BLOB或CLOB或NCLOB以及许多行,order by子句将花费很长时间来:

生成条目 对CreateDt进行排序 因此,在读取表的所有数据时,会放置一个读锁共享锁。此锁接受其他共享锁,但禁止放置独占锁来修改数据插入、更新和删除。这可能会向其他用户保证数据不会被修改

这种锁定技术被称为悲观锁。锁在开始执行查询之前获取,并在结束时释放。所以读者阻止作者,作者阻止所有人

SQL Server可以执行的另一项技术,称为乐观锁定,包括使用数据的副本,而不进行任何锁定,并在执行结束时验证写入中涉及的数据从一开始就没有被修改。所以阻塞更少

要执行悲观锁定,您可以选择允许或强制:

ALTER DATABASE CURRENT SET ALLOW_SNAPSHOT_ISOLATION ON;
ALTER DATABASE CURRENT SET READ_COMMITTED_SNAPSHOT ON;

在SQL Server中,写入程序阻止读卡器,读卡器阻止写入程序。 此查询没有where子句,并且将涉及整个表,可能从IS INTERNT Shared开始,最终升级到共享锁,该锁存在时更新/插入/删除无法访问。这很可能是在很长的排序过程中,由order引起的

可以通过几种方式绕过它,但我不认为您实际上是在研究how,因为不管是谁运行查询,都可能没有真正正确地思考问题,而且这种情况并不常见。 然而,这里有一些绕过的方法:

读提交快照隔离 和诺洛克。但只有当您不真正关心检索到的数据时,它才能返回两行,即从未提交的行,并完全跳过行。 减少返回并从非聚集索引读取的列。
但要回答您的问题,请选择“是”可以阻止插入。

这是否回答了您的问题?这让我相信它们是相互关联的。连接和彻底记录,数百篇文章,课程,书籍解释为什么会发生这种情况,以及如何避免这种情况。它从没有理由不查询1M行开始。读取整个表时,锁将升级到表级别本身,阻止修改。你想干什么?如果确实需要读取所有这些行,可以使用快照隔离。这有其自身的成本,因为在读取事务完成之前,已修改行的版本会复制到tempdb中。更好的设计可能更快、更便宜。据我所知,它们之间肯定是相互关联的。答案似乎表明,开发人员应该编写他们的查询,这是避免这种情况的一种特殊方法。但是,这并不能阻止这种情况的发生,例如,由于偶然的原因,是否存在使这种情况不可能发生的特权级别?请查看有关锁升级到页面或表级别的原因以及如何避免这种情况的解释。这与特权无关,更多的是关于设计。出于操作和报告目的使用同一个表是一个坏主意,因为报告读取大量数据,阻塞数据modifications@Ben为了防止这种情况,请不要在生产环境中运行特殊查询。不要无缘无故地给人们提供数据阅读器。如果人们需要实验或报告,克隆或复制数据。SQL Server中的备份操作处于启用状态 行(他们不阻止应用程序)。您可以根据需要进行备份,并将其恢复到其他服务器上。为开发人员提供该服务器上的datareader,而不是生产数据库