【问题标题】:How to prevent transaction locking in sql server for all the connections?如何防止所有连接的 sql server 中的事务锁定?
【发布时间】:2014-11-24 22:01:19
【问题描述】:

你好

我有一个 Sql Server 数据库,它可以从两个不同的应用程序访问,其中一个应用程序只是从数据库中选择(我们将其命名为 x)和另一个(将其命名为 y)正在做所有事情。 我的问题是当 y 应用程序通过事务插入或更新数据库时,x 应用程序无法从数据库中读取。

我阅读了有关事务隔离级别的信息,发现 SNAPSHOT 隔离级别对我的情况很好,但我不知道如何使数据库的默认隔离级别为 SNAPSHOT这样我就不必为每个事务或每个连接指定隔离级别。

简而言之: 我想在另一个应用程序的事务正在运行时通过一个应用程序从数据库中读取数据。

谢谢

【问题讨论】:

  • 这听起来更像是资源问题,而不是数据库问题。如果两个数据库彼此独立,则数据库 x 没有响应的唯一(主要)原因是缺乏资源,无论是处理时间还是磁盘访问。这可能是数据库 a 上缺少索引的问题,或者是驱动器等待时间过长、内存不足等的贫血服务器……如果数据库相互交互,请参阅以下有关隔离设置的答案。
  • 对不起,先生,您想念我了。我没有两个不同的数据库,我有两个不同的应用程序(x 和 y)处理同一个数据库。
  • 是的,我想念这个问题。
  • 考虑到这一点,M.Ali 有一个很好的观点。如果数据不必 100% 是最新的,则将数据分解为事务数据库和报告数据库可能会解决问题而不会出现问题。然后通过复制、批处理将相关信息移植到报告服务器......

标签: sql sql-server transactions


【解决方案1】:

为了能够将最后提交的数据读取到磁盘,如果正在修改数据,快照隔离是一个很好的解决方案。

您可以通过执行以下命令来启用快照隔离。

ALTER DATABASE Database_Name 
SET READ_COMMITTED_SNAPSHOT ON;
GO

请注意,它会广泛使用您的 Temp 数据库,请确保您的 Tempdb 位于有足够可用空间的驱动器上。

另一方面,如果应用程序 A 仅读取,那么您可能会寻找不同的解决方案,例如完全拥有一个单独的只读数据库,您可以将日志传送设置为具有该数据库的只读副本,或者也许数据库复制。

【讨论】:

  • 首先感谢您的回复,但是您提供的查询不起作用,它一直在 ssms 中运行,没有任何输出,就像有事务一样。另一个问题,如果这个查询有效,我应该只在数据库中执行一次,还是每次连接到数据库时都必须执行?
  • 它一直在运行可能是因为您的数据库正在使用中,请确保在执行此查询之前没有与数据库的活动连接。您只需执行一次此查询,它将开始使用快照隔离。如果您想恢复它,您必须明确将其关闭。
【解决方案2】:

更改隔离级别非常简单:

ALTER DATABASE dbname SET READ_COMMITTED_SNAPSHOT ON;

但是,您需要真正地确保您了解不同隔离级别的后果。我建议将这篇 Brent Ozar (by Kendra Little) 文章作为起点。

【讨论】:

  • Brent Ozar 是所有 DBA 方面的优秀资源
猜你喜欢
  • 1970-01-01
  • 2016-12-08
  • 1970-01-01
  • 1970-01-01
  • 2017-03-27
  • 2019-04-06
  • 1970-01-01
  • 2019-06-30
  • 1970-01-01
相关资源
最近更新 更多