• SQL Server 并发控制 第一篇:并发模式和事务


    SQL Server 并发控制 第一篇:并发模式和事务

    SQL Server 并发控制 第二篇:隔离级别和锁(1)

    SQL Server 并发控制 第三篇:隔离级别和行版本(2)

    在操作系统中,并发是指一个很短的时间段中有几个程序都处于已启动运行状态,到运行完毕状态之间,多个程序之间有相互制约关系,直接制约体现为一个程序需要另一个程序的计算结果,间接制约体现为多个程序竞争同一资源,如缓冲区、数据等。在数据库系统中,并发主要是指资源的争用,当两个进程在同一时刻访问或更新同一个数据时,就会产生资源的争用,当对资源争用不加以控制时,它会引起一系列的问题,比如数据不一致、查询阻塞、死锁等。

    SQL Server必须对资源争用加以控制,实现并发控制读操作的不同方法,称作并发模式。当发生读写冲突时,并发模式控制数据处理的顺序,以保证数据的一致性。注意,不管在哪种并发模式下,写操作和写操作之间永远冲突。

    一,并发模式

    SQL Server支持悲观并发模式和乐观并发模式来控制并发,保证事务的ACID属性,两种并发模式的不同之处是保护数据的结构不同。在一个数据库中,只能选择其中一个并发模式,默认的并发模式是悲观并发模式。

    1,悲观并发模式

    悲观并发模式使用锁结构来保护数据,保证数据的一致性,适用于锁消耗低于回滚事务的成本环境中。

    悲观并发模式是默认的并发模式,在数据库系统中,当多个进程访问同一资源时,SQL Server会通过各种类型的锁来协调资源的访问,确保在并发环境下数据保持一致的状态。而锁的作用范围是在事务中,事务建立在并发模式下。

    在悲观并发模式下,SQL Server认为有大量的写操作发生,并且写操作会受到写操作的影响。也就是说,悲观并发模式对任何正在访问的数据进行加锁,以避免多个进程同时修改或读取数据,造成数据的不一致。在默认的隔离级别下,读和写是相互阻塞的。

    2,乐观并发模式

    乐观并发模式在并发过程中不产生锁,而是使用行版本(Row Version)来保护数据,保证数据的一致性,适用于写操作较少的环境中。

    在乐观并发模式下,当一个事务对数据进行修改时,SQL Server把已经提交的老版本数据存储在tempdb的版本库(version store)中。读操作读取的是已经提交的老版本,这些数据实际上存储在tempdb中。

    对于乐观并发模式,SQL Server假设只有少量的写写冲突发生,默认的机制是使用快照技术,在写进程完成数据修改之前,先把数据的行版本保存到tempdb中。由于数据的老版本已经保存,读进程可以直接读取已经保存的行版本,而不会受到写进程的影响。

    乐观并发使得读写操作不会相互阻塞,但是,这会导致一个潜在的问题,读进程可能会读取到老的数据。

    注意:在任何并发模式下,写写进程总是相互阻塞的。

    二,事务

    事务在逻辑上是一个整体,是一个工作单元,是指一条或多条语句的组合,要么全部执行成功,要么全部不执行,事务具有4个特性,统称ACID属性:

    • 原子性:事务整体是一个工作单元,对数据的修改操作,要么全部执行,要么完全不执行,没有第三种状态。
    • 一致性:在一个事务执行之前和执行之后数据库都必须处于逻辑上的一致性状态,数据在不同的事务中是相同的。
    • 隔离性:并发执行的事务之间是相互隔离的,一个事务内部的状态,对其他事务是不可见的。
    • 持久性:当系统发生故障时,持久性确保已提交事务的更新不会丢失,也就是说一旦一个事务提交,DBMS保证数据的改变是永久性的,持久性通过事务日志来保证。

    根据事务的触发方式,把事务分为隐式事务和显式事务。

    1,隐式事务

    默认情况下,单个语句自动触发隐式事务,在语句执行时,事务自动开始;当语句执行成功,事务自动提交;当语句执行失败,事务自动回滚。隐式事务只能包含一个语句,当语句执行成功之后,事务就自动提交了。隐式事务不能回滚,除非语句运行失败。

    2,显式事务

    使用begin tran命令开启一个事务;使用commit tran提交一个事务;使用rollback tran回滚一个事务。在事务内,可以包含多个语句,这些语句作为一个整体,具有事务的ACID属性。

    参考文档:

  • 相关阅读:
    当年偶然发现的 Java Bug(JDK 9及之前仍未修复)
    Centos 网卡命名规范及信息查看(物理网卡,虚拟网卡)
    Git 合并多个 commit,保持历史简洁
    Java 常用验证方法(commons-validator,hutool)
    Linux 日常操作(质量团队培训材料)
    Linux 帮助命令及工具(tldr,man,help,info)
    springmvc返回html页面解决方案
    二进制和十进制来回转换
    二进制按位与(&) 按位或(|) 异或运算(^)
    Spring容器和springmvc容器的区别联系
  • 原文地址:https://www.cnblogs.com/ljhdo/p/4813675.html
Copyright © 2020-2023  润新知