如何防止sql server中的事务锁定所有连接?

时间:2014-11-24 22:01:19

标签: sql sql-server transactions

你好

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

我读过有关事务隔离级别的内容,发现 SNAPSHOT 隔离级别对我的情况有好处,但我不知道如何设置默认的隔离级别数据库是SNAPSHOT,因此我不必为每个事务或每个连接指定隔离级别。

简而言之: 我想通过应用程序从数据库中读取数据,而来自其他应用程序的事务正在运行。

感谢

2 个答案:

答案 0 :(得分:1)

更改隔离级别非常简单:

ALTER DATABASE dbname SET READ_COMMITTED_SNAPSHOT ON;

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

答案 1 :(得分:1)

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

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

ALTER DATABASE Database_Name 
SET READ_COMMITTED_SNAPSHOT ON;
GO

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

另一方面,如果应用程序A只读取,那么你可能会查看另一个解决方案,比如只有一个单独的只读数据库,你可以让Log-shipping设置为拥有该数据库的只读副本或者数据库复制。