Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/21.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
Sql server SQL Server数据库设置与隔离级别的比较_Sql Server_Sqlconnection_Isolation Level_Snapshot Isolation_Read Committed Snapshot - Fatal编程技术网

Sql server SQL Server数据库设置与隔离级别的比较

Sql server SQL Server数据库设置与隔离级别的比较,sql-server,sqlconnection,isolation-level,snapshot-isolation,read-committed-snapshot,Sql Server,Sqlconnection,Isolation Level,Snapshot Isolation,Read Committed Snapshot,在过去几年中,我们注意到SQL server(2008r2)数据库中死锁和长时间运行事务的数量有所增加。目前,我们使用以下设置运行数据库允许快照隔离关闭和读取已提交的快照关闭。死锁是使用重试/等待过程从代码中管理的 我们的应用程序代码(c#)使用默认构造函数(从反编译看来是IsolationLevel.Unspecified)创建SqlConnection),我认为这允许SQL自己做事情,在我们的例子中,这与读取提交的(我想)是一样的 我们希望通过设置ALLOW_SNAPSHOT\u ISOLA

在过去几年中,我们注意到SQL server(2008r2)数据库中死锁和长时间运行事务的数量有所增加。目前,我们使用以下设置运行数据库
允许快照隔离关闭
读取已提交的快照关闭
。死锁是使用重试/等待过程从代码中管理的

我们的应用程序代码(c#)使用默认构造函数(从反编译看来是
IsolationLevel.Unspecified
)创建
SqlConnection
),我认为这允许SQL自己做事情,在我们的例子中,这与
读取提交的
(我想)是一样的

我们希望通过设置
ALLOW_SNAPSHOT\u ISOLATION ON
READ_COMMITTED_SNAPSHOT ON
并使用
RepeatableRead
覆盖c构造函数来引入快照。我相信这种设置组合将使我们的代码能够像现在一样工作。这将允许我们对代码库进行逐段评估,以确保隔离级别和快照中的更改不会对我们当前感知SQL过程的功能产生负面影响。当然,我们需要将
SET TRANSACTION ISOLATION LEVEL SNAPSHOT
添加到我们希望从快照中获益的任何过程的开头(以覆盖
IsolationLevel.RepeatableRead的c#设置)

以这种方式处理它的原因是,这两个数据库设置实际上迫使我们将数据库脱机,这需要一个维护窗口,我们希望准备进行逐渐的更改,但希望代码继续执行,就像更改后立即执行一样


我只是想确认一下我的理解是正确的。如果我错了,在进行2次数据库更改之后,为了模拟我们当前的工作环境,我需要做什么?

可重复读取
已提交
不同。您将获得大致相同的行为(如中锁定的代码),但仍将获得比以前更多的锁定,并对行为进行适当的更改(可能还会有更多的锁定)。我认为更好的方法是采用另一种方法:设置
允许快照隔离(除非我大错特错,否则不需要数据库脱机),修改代码片段以显式使用快照隔离(准备重试),并设置
读取提交的快照
,或者,当您基本完成时。设置
ALLOW\u SNAPSHOT\u ISOLATION ON
不需要数据库脱机,这是正确的。但是,它确实要求不存在开放连接,因此在高使用率系统中,您必须将数据库设置为
单用户
受限用户
模式…这基本上意味着将其脱机。我遇到的问题是,在
上设置
允许快照(SNAPSHOT)隔离也会改变行为,我需要一个组合设置,允许我强制行为模拟情况目前正在工作。除非我还是误会?值得指出的是,由于需要审查的程序数量众多,在未来12个月内,只有一个子集将被更改,其余的可能会无限期地保持目前的行为方式!我很确定那也不是真的<代码>读取已提交的快照关闭
,是<代码>允许在
上进行快照隔离,否。即使存在打开的连接,它也应工作。它确实需要等待所有事务完成,但如果您有长期运行的事务从未完成,这是它自己的问题。如果您想让
READ COMMITTED
语义即使
READ\u COMMITTED\u SNAPSHOT
设置为
ON
,您也可以使用T-SQL中的
READCOMMITTEDLOCK
表提示。没有这样的提示,没有任何隔离级别也会这样做<代码>允许快照隔离在功能上不会更改任何客户端的行为。它只会增加tempdb的负载,tempdb现在必须跟踪版本化的行。