use*_*552 68 sql-server snapshot isolation-level read-committed-snapshot
有人可以帮我理解何时在SQL Server中使用SNAPSHOT隔离级别而不是READ COMMITTED SNAPSHOT?
据我所知,在大多数情况下,READ COMMITTED SNAPSHOT可以正常工作,但不确定何时进行SNAPSHOT隔离.
谢谢
Bil*_*zke 71
READ COMMITTED SNAPSHOT
做乐观的阅读和悲观的写作.相反,SNAPSHOT
乐观的阅读和乐观的写作.
Microsoft建议READ COMMITTED SNAPSHOT
大多数需要行版本控制的应用程序.
阅读这篇优秀的Microsoft文章:选择基于行版本控制的隔离级别.它解释了两种隔离级别的好处和成本.
这里有一个更彻底的:http: //msdn.microsoft.com/en-us/library/ms345124(SQL.90).aspx
Aki*_*oto 37
请参阅以下示例:
读取提交的快照
更改数据库属性,如下所示
ALTER DATABASE SQLAuthority
SET READ_COMMITTED_SNAPSHOT ON WITH ROLLBACK IMMEDIATE
GO
Run Code Online (Sandbox Code Playgroud)
第1节
USE SQLAuthority
GO
BEGIN TRAN
UPDATE DemoTable
SET i = 4
WHERE i = 1
Run Code Online (Sandbox Code Playgroud)
第二节
USE SQLAuthority
GO
BEGIN TRAN
SELECT *
FROM DemoTable
WHERE i = 1
Run Code Online (Sandbox Code Playgroud)
结果 - 会话2中的查询显示旧值(1,ONE),因为当前事务未提交.这是避免阻塞和读取已提交数据的方法.
第1节
COMMIT
Run Code Online (Sandbox Code Playgroud)
第二节
USE SQLAuthority
GO
SELECT *
FROM DemoTable
WHERE i = 1
Run Code Online (Sandbox Code Playgroud)
结果 - 会话2中的查询显示没有行,因为行在会话1中更新.因此,我们再次看到已提交的数据.
快照隔离级别
这是新的隔离级别,可从SQL Server 2005开始提供.对于此功能,应用程序需要进行更改,因为它必须使用新的隔离级别.
使用以下更改数据库设置.我们需要确保数据库中没有事务.
ALTER DATABASE SQLAuthority SET AllOW_SNAPSHOT_ISOLATION ON
Run Code Online (Sandbox Code Playgroud)
现在,我们还需要使用下面的方法来更改连接的隔离级别
第1节
USE SQLAuthority
GO
BEGIN TRAN
UPDATE DemoTable
SET i = 10
WHERE i = 2
Run Code Online (Sandbox Code Playgroud)
第二节
SET TRANSACTION ISOLATION LEVEL SNAPSHOT
GO
USE SQLAuthority
GO
BEGIN TRAN
SELECT *
FROM DemoTable
WHERE i = 2
Run Code Online (Sandbox Code Playgroud)
结果 - 即使我们将值更改为10,我们仍将在会话2(2,TWO)中看到旧记录.
现在,让我们在会话1中提交事务
第1节
COMMIT
Run Code Online (Sandbox Code Playgroud)
让我们回到会话2并再次运行select.
第二节
SELECT *
FROM DemoTable
WHERE i = 2
Run Code Online (Sandbox Code Playgroud)
我们仍然会看到记录,因为会话2已经使用快照隔离声明了事务.除非我们完成交易,否则我们不会看到最新的记录.
第二节
COMMIT
SELECT *
FROM DemoTable
WHERE i = 2
Run Code Online (Sandbox Code Playgroud)
现在,我们不应该看到已经更新的行.
请参阅:SQL Authority,Safari Books Online
小智 5
如果不讨论可能在快照中发生的可怕的“快照更新冲突”异常,而不对“快照已提交快照”,则无法完成快照与“快照已提交快照”的比较。
简而言之,快照隔离在事务开始时检索已提交数据的快照,然后对读取和写入使用乐观锁定。如果在尝试提交事务时,发现其他更改改变了某些相同的数据,则数据库将回滚整个事务并引发错误,从而导致调用代码中出现快照更新冲突异常。这是因为受事务影响的数据版本在事务结束时与开始时不同。
快照已提交快照不受此问题的困扰,因为它使用了写锁定(悲观写),并且在每个语句的stat处获取所有已提交数据的快照版本信息。
快照更新和“未提交快照读取”中发生快照更新冲突的可能性是两者之间的极大差异。
归档时间: |
|
查看次数: |
51974 次 |
最近记录: |