首页  ·  知识 ·  数据库
SQLServer2005快照隔离级别(SnapshotIsolation)
宋立桓  http://www.winmag.com.cn/forum/  MS-SQL  编辑:dezai  图片来源:网络
在SQLServer2005之前,事务是以悲观方式控制的,这意味着所有事务都获得锁定。如果某个事务更改了某一行,那么在写操作提交之前另一个
在 SQL Server 2005 之前,事务是以悲观方式控制的,这意味着所有事务都获得锁定。如果某个事务更改了某一行,那么在写操作提交之前另一个事务就不能读取该行。SQL Server2005 引入了一种新的隔离级别,称为 SNAPSHOT,它允许您使用以下这种模式:写入程序不会阻碍读取程序,而且为读取程序提供了它们所请求数据的已提交版本。SQL Server 2005 在 tempdb 中维护着一个链接列表,负责跟踪行的更改并为读取程序构造一个较旧的已提交的数据版本。这种隔离对于开放式锁定而言是有用的,在开放式锁定中 UPDATE 冲突并不常见。

1. 启动SQL Server Management Studio,连接到数据库服务器实例,新建查询,打开查询编辑器,在代码窗格中,键入 Transact-SQL 语句,创建要使用的测试数据库demo
USE master
IF  EXISTS (SELECT name FROM master.dbo.sysdatabases WHERE name = N'DEMO')
DROP DATABASE demo
CREATE DATABASE demo
2.为了能够工作在 SNAPSHOT 隔离级别模式下,必须打开数据库选项 ALLOW_SNAPSHOT_ISOLATION。然后创建一个在 datacol 列中具有值为“Version1”的 T1 表:

USE demo
ALTER DATABASE testdb SET ALLOW_SNAPSHOT_ISOLATION ON
CREATE TABLE T1 (
  keycol  INT   NOT NULL PRIMARY KEY,
datacol VARCHAR(10) NOT NULL  )
go
INSERT INTO T1 valueS(1, 'Version1')
go
3. 从连接 1 发出以下代码,它将打开一个事务并将 datacol 中的值更改为“Version2”:

USE demo
BEGIN TRAN
  UPDATE T1 SET datacol = 'Version2' WHERE keycol = 1
  SELECT * FROM T1

4. 重新新建一个查询,在连接 2 并运行以下代码,它将把会话的隔离级别设置为 SNAPSHOT,并检索 表T1 的内容:

USE testdb
SET TRANSACTION ISOLATION LEVEL SNAPSHOT
SELECT * FROM T1
请注意,写入程序不会阻碍读取程序,而且为读取程序提供了它们所请求数据的已提交版本,检索回的还是“Version1”。

5.现在转到连接 1 并提交事务,然后用一个 COMMIT 命令关闭所有连接,实验结束。
本文作者:宋立桓 来源:http://www.winmag.com.cn/forum/
CIO之家 www.ciozj.com 微信公众号:imciow
    >>频道首页  >>网站首页   纠错  >>投诉
版权声明:CIO之家尊重行业规范,每篇文章都注明有明确的作者和来源;CIO之家的原创文章,请转载时务必注明文章作者和来源;
延伸阅读
也许感兴趣的
我们推荐的
主题最新
看看其它的