• Transaction And Lock--快照事务隔离级别


    --================================================
    --准备数据
    GO
    CREATE DATABASE DB5
    GO
    USE DB5
    GO
    CREATE TABLE TB1
    (
    ID INT PRIMARY KEY,
    V1 INT,
    RV ROWVERSION
    )
    GO
    INSERT INTO TB1(ID,V1)
    SELECT 1,1
    UNION
    SELECT 2,2
    GO
    SELECT * FROM TB1
    --================================================
    --设置数据库可以使用SNAPSHOT隔离级别
    ALTER DATABASE DB5 SET ALLOW_SNAPSHOT_ISOLATION ON
    GO
    SET TRANSACTION ISOLATION LEVEL SNAPSHOT
    BEGIN TRAN tr1
    SELECT * FROM TB1
    WAITFOR DELAY '0:0:05'
    SELECT * FROM TB1

    --在事务开启后打开另外事务修改数据并提交

    --=====================================================
    在快照隔离级别下,在事务执行过程中,数据已被外部事务修改并且提交,但查询会得到过时数据(取决于生成快照的第一次时间点在外部事物发生前还是发生后),对过时数据修改会报以下错误:
    快照隔离事务由于更新冲突而中止。您无法在数据库'DB5'中使用快照隔离来直接或间接访问表 'dbo.TB1',以便更新、删除或插入已由其他事务修改或删除的行。请重试该事务或更改 update/delete 语句的隔离级别。

    --推断:快照事务隔离级别下,在第一次查询时建立快照,并在后续访问快照并持续到事务结束,因此数据可能过时

    --建议:1)避免在快照事务隔离级别下修改数据
           2)确定业务允许访问过时数据


    优点:有效较少读和写得阻塞
    缺点:维护行版本需要额外的开销,且可能读取到旧数据,在快照隔离级别下修改数据会引发事务冲突。

    参考:http://www.cnblogs.com/lyhabc/articles/3219693.html
     

  • 相关阅读:
    练习:使用nmcli 配置网络连接
    编辑网络配置文件
    ETCD安装
    LInux部署本地DNSbind9
    Linux 修改tomcat9相关参数优化
    Linux-编写SHELL 加密解密方法
    Jenkins的安装部署
    lepus 配置监控Mysql+Redis+Mongodb服务器
    lepus部署
    prometheus + grafana 安装 监控 redis mysql mongodb Linux服务器
  • 原文地址:https://www.cnblogs.com/TeyGao/p/3522954.html
Copyright © 2020-2023  润新知