快照隔离(Snapshot Isolation)简单介绍和例子

本文介绍了快照隔离(Snapshot Isolation)技术的工作原理及其在数据库中的应用。通过一个实例演示了如何启用快照隔离,并展示了它如何使得读取操作不受写入操作的影响,从而提高数据的可用性和并发性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

快照隔离(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

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值