一些情况:
首先,我们编写报告只是“直截了当”,在查询中没有任何锁定提示。对于较大的报告,这有时会导致锁定问题。在第一,我们通过使用补救这WITH (NOLOCK)
提示在查询表。
因为(a)它是相当突兀,和(b)很容易忘记一个表的提示,我们搬到了第二种方法设置TRANSACTION ISOLATION LEVEL
到READ UNCOMMITTED
每个数据集的查询的顶部(这是罚款)。
您可能会猜到,忘记其中一个数据集的提示仍然很容易。因此,这导致了一个问题:
问题:与报告查询一起发送NOLOCK
提示的选项有哪些?
PS。我意识到这在某种程度上是一个XY问题(我还有很多其他的X选择,例如优化查询,不对操作数据库进行报告等),但是尽管如此,它还是试图使之成为一个有效的问题。
选项:
以下是上述选项,并添加了一些选项,我很好奇它们是否可以工作:
WITH (NOLOCK)
为每个表设置提示。(突兀,很容易忘记)- 将
READ UNCOMMITTED
整个查询的隔离级别设置为。(仍然容易忘记) - 是否可以在报告级别指定?例如,确保一个报表的所有数据集查询都将不锁定地运行。
- 是否可以在其他SSRS级别上指定它?例如,可能是为某个报表文件夹设置此设置,还是使用扩展名?
- 是否可以在数据源/连接字符串级别指定此名称?例如,所有相关报告是否都使用特定的“无锁数据源”?
- 与上一个选项相关:也许可以为特定的“ no-lock-sql-user”(在连接中使用的那个)指定默认的锁定提示?
- ???
哪些选项可行?有没有我错过的选择?
到处乱锁或将隔离更改为全面读取未提交的问题是数据质量问题。您不仅会读取脏数据,而且还可能两次返回相同的数据或完全丢失数据。最好查看您的设计,看看是否应该使用单独的报告数据库。看到这个问题
—
Mike Walsh 2012年
@MikeWalsh同意。这也是我在XY问题上也尝试涉及的内容。尽管如此,如果谨慎使用,知道在何时何地使用锁定提示可能是有益的。
—
Jeroen 2012年