快照隔离(Snapshot Isolation)简单介绍和例子
快照隔离(Snapshot Isolation)特性
1、写入程序不会阻碍读取程序
2、Snapshot isolation must be enabled for DB
ALTER DATABASE 数据库 SET allow_snapshot_isolation ON
3、Snapshot isolation must be enabled for connection Set transaction isolation level snapshot
4、UPDATE transactions keep old versions of data in a linked list
5、新的隔离级别提供了以下优点:
- 提高了只读应用程序的数据可用性
- 允许在OLTP环境中执行非阻止读取操作
- 可对写入事务进行自动的强制冲突检测
例子
首先创建数据库
create database demo use demo ALTER DATABASE demo SET allow_snapshot_isolation ON CREATE TABLE test ( tid INT NOT NULL primary key, tname VARCHAR(50) NOT NULL ) INSERT INTO test VALUES(1,'version1') INSERT INTO test VALUES(2,'version2')
然后建立连接,在测试的时候一个连接其实就是相当于新建一个查询。
连接一:
USE demo BEGIN TRAN UPDATE test SET tname='version3' WHERE tid=2 SELECT * FROM test
可以看到我们在连接一种修改了数据库中的内容,查询结果为:
tid name
1 version1
2 version3
连接二:
USE demo SET transaction isolation level snapshot SELECT * FROM test
查询结果为:
tid name
1 version1
2 version2
总结
从查询结果中我们可以看到如果使用了快照隔离(snapshot isolation)技术以后每一个被修改的数据项都保留了一个备份。我们如果选择在快照隔离级别下查找,那么我们能够找到旧的版本。
PS:
如果我们这里直接使用查询语句
连接三:
use demo SELECT * FROM test
则会提示连接超时,这是因为我们在连接一种是用了事务的概念,在没有提交事务一的情况下其他连接无法再普通模式下访问被事务操纵的数据。
我们在连接一种加入
COMMIT TRAN
命令,这样事务提交,则连接三可以访问,查询结果为连接一修改后的结果:
tid name
1 version1
2 version3