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

    作者:xwdreamer
    欢迎任何形式的转载,但请务必注明出处。
    分享到:
  • 相关阅读:
    [C#性能简析]泛型集合的使用
    理解自定义特性(Attribute)
    C语言第1次作业2.0版
    C语言第3次作业
    C语言第1次作业
    C语言第2次作业
    kubernetes 部署metricserver
    安装nginx
    C# Winform应用程序内存回收
    asp.net 数据库访问操作类
  • 原文地址:https://www.cnblogs.com/xwdreamer/p/2297081.html
Copyright © 2020-2023  润新知