首页 > 数据库 >SQL Server事务隔离级别

SQL Server事务隔离级别

时间:2022-09-03 16:33:18浏览次数:92  
标签:事务 读取 数据库 Server 提交 SQL 隔离

事务

定义

事务是作为单个逻辑工作单元执行的一系列操作。 一个逻辑工作单元必须有四个属性,称为原子性、一致性、隔离性和持久性 (ACID) 属性,只有这样才能成为一个事务。

一个事务可以包含多个操作。

事务特性

  • 原子性(atomicity)

事务中的所有操作要么全部成功,要么全部失败,没有第三种状态。

  • 一致性(consistency)

事务执行前后数据都处于一个最终一致性的状态;比如库存扣减前后库存总量(剩余库存+已扣减库存)总是保持一致。

  • 隔离性(isolation)

多事务执行情况下,事务与事务之间相互无感知,相互不影响。

  • 持久性(durability)

事务一旦提交,其更改对数据库中的数据是永久性的,即使数据库发生故障也必须要保证事务正确执行。

事务分类

  • 显式事务

通过begin transaction标记事务开始,由commit transaction提交事务,rollback transaction回滚事务。

  • 隐式事务

使用set implicit_transactions on 语句,将隐式事务模式设置为打开。该模式下不必使用 begin transaction 开启事务,当一个事务结束后会自动启用下一个事务,只需使用 commit transaction 提交事务或 Rollback Transaction 回滚事务即可。

  • 自动提交事务

SQL Server 的默认模式,它将每条单独的 T-SQL 语句视为一个事务。如果成功执行,则自动提交。如果错误,则自动回滚。相比大家也没有遇到过update一条记录多个字段的时候部分字段更新成功,部分字段更新失败。

事务不隔离产生的问题

  • 更新丢失

多个事务更新同一条数据时导致最后更新完成的事务覆盖掉了之前事务的更新,这就导致了前面事务的更新丢失。

  • 脏读

读事务读取到了写事务还未提交的数据更改,写事务执行过程中回滚了,导致读事务前后读取的数据不一致。

  • 不可重复读

在读事务范围内多次执行查询的结果不一致,因为在读取事务执行期间有写事务读事务读取的数据进行了修改。

  • 幻读

在读事务范围内多次执行查询的结果记录条数不一致,因为在读取事务执行期间有写事务读事务读取的数据范围进行了添加或删除。

事务隔离级别

Read Uncommitted(可读未提交)

允许事务读取写事务未提交的更改(也就是允许脏读),但不允许更改写事务正在处理的数据。

Read Committed(可读已提交)

不允许其他事务读取写事务未提交的更改(不允许脏读),但允许更改读事务正在读取的数据(允许不可重复读),这也是SQL SERVER默认的事务隔离级别。

Repeatable Read(可重复读)

不允许其他事务更改读事务正在读取的数据(不允许不可重复读),但是允许新增或删除(允许幻读)。

Serializable(序列化)

要求事务只能一个一个执行,不能并发,但是效率地下,消耗数据库性能,一般不使用。

其他隔离级别(拷贝的官方文档)

读取已提交的快照(READ_COMMITTED_SNAPSHOT)

当 READ_COMMITTED_SNAPSHOT 数据库选项设置为 ON 时,已提交读隔离使用行版本控制提供语句级读取一致性。 读取操作只需要 SCH-S 表级别的锁,不需要页锁或行锁。 也就是说,SQL Server数据库引擎使用行版本控制来呈现每个语句,其中包含在语句开始时存在的数据的事务一致性快照。 不使用锁来防止其他事务更新数据。 用户定义的函数可以返回在包含 UDF 的语句开始后提交的数据。
如果 READ_COMMITTED_SNAPSHOT 数据库选项设置为 OFF(这是默认设置),当前事务运行读取操作时,已提交读隔离使用共享锁来防止其他事务修改行。 共享锁还会阻止语句在其他事务完成之前读取由这些事务修改的行。 两个实现都满足已提交读隔离的 ISO 定义。

快照

快照隔离级别使用行版本控制来提供事务级别的读取一致性。 读取操作不获取页锁或行锁,只获取 SCH-S 表锁。 读取其他事务修改的行时,读取操作将检索启动事务时存在的行的版本。 当 ALLOW_SNAPSHOT_ISOLATION 数据库选项设置为 ON 时,只能对数据库使用快照隔离。 默认情况下,用户数据库的此选项设置为 OFF。

参考链接:https://www.cnblogs.com/xiongze520/p/14821536.html
https://docs.microsoft.com/zh-cn/sql/relational-databases/sql-server-transaction-locking-and-row-versioning-guide?view=sql-server-ver16

标签:事务,读取,数据库,Server,提交,SQL,隔离
From: https://www.cnblogs.com/clue-yang/p/16639778.html

相关文章

  • 4.2 安装与配置mysql模块
    在使用mysql模块操作mysql数据库之前,必须先对mysql模块进行必要的配置步骤如下:constmysql=require('mysql')constdb=mysql.createPool({host:'127.0.0.1......
  • geoserver如何配置图层样式(SLD格式)
    一、基本样式点(se:PointSymbolizer)线(se:LineSymbolizer)面(se:PolygonSymbolizer)<?xmlversion="1.0"encoding="UTF-8"?><StyledLayerDescriptorxmlns="http://......
  • PostgreSQL-表继承
    让我们从一个例子开始:假设我们正在尝试为城市构建一个数据模型。每个州都有许多城市,但只有一个首府。我们希望能够快速检索任何特定州的首都。这可以通过创建两张表来完成,......
  • SQL经典用法:开窗函数之LEAD() OVER()和ROW_NUMBER() OVER()
    案例需求:求哪些店铺的电子类产品连续3个月增长shop month dz fz spa,2019-01,3000,5000,2000a,2019-02,6000,4000,3000b,2019-01,3000,5000,2000b,2019-02,60......
  • Docker基础知识 (8) - 使用 Docker 部署 SpringBoot + MariaDB(MySQL)项目
    本文在“ Docker基础知识(7)-使用Docker部署SpringBoot项目”里的SpringbootWebDocker项目的基础上,添加JDBC、MariaDB和MyBatis相关依赖包和数据库操作代......
  • PostgreSQL-schema
    数据库包含一个或多个命名模式,这些模式又包含表。模式还包含其他类型的命名对象,包括数据类型、函数和运算符。相同的对象名称可以在不同的模式中使用而不会发生冲突;例如,sch......
  • PostfreSQL-行安全策略
    除了通过GRANT提供的SQL标准权限系统之外,表还可以具有行安全策略,这些策略基于每个用户来限制正常查询可以返回哪些行,或者可以通过数据修改命令插入、更新或删除哪些行......
  • django中操作mysql数据库
    1.准备工作(django连接数据库)1.本机电脑下载好mysql数据库2.打开django,修改setting.py中的DATABASES配置项DATABASES={'default':{'ENGINE':'django.d......
  • SQL 错误 [1062] [23000]: Duplicate entry 'xxxx' for key 'xxxx'
    异常内容SQL错误[1062][23000]:Duplicateentry'xxxx'forkey'xxxx'分析异常如果报错内容如上所示,原因该表有一列唯一索引或者多列添加了联合唯一索引解决方案......
  • MySQL数据库如何线上修改表结构
    一、MDL元数据锁在修改表结构之前,先来看下可能存在的问题。1、什么是MDL锁MySQL有一个把锁,叫做MDL元数据锁,当对表修改的时候,会自动给表加上这把锁,也就是不需要自己显式......