事务的ACID特性

技术是为了解决问题而生的,通过事务我们可以解决以下问题:

  • 多个操作不是一个整体操作,出现了部分执行成功的情况,导致数据的状态不一致问题(原子性)
  • 一组操作只有部分完成,没有全部完成,但是此时可以访问到数据的不一致状态问题(可见性问题,隔离性)
  • 两组操作并发执行,导致的并发问题
  • ……

事务存在的意义:保证系统中的数据是正确的,不同数据间不会产生矛盾,也就是保证数据状态的一致性。

事务是什么(事务的概念):事务是一个或多个操作的组合操作,并且事务对这个组合操作提供一个保证,如果这个组合操作执行之前的数据是一致的(即正确的),那么执行组合操作之后的数据也应该是一致的。不论这个组合操作执行的过程中,发生了系统故障,还是在这个组合操作执行的过程中,是否与其他事务一起执行。(这也对应了上面提到的事务要解决的问题)

即使没有事务支持, 或许上层应用依然可以工作, 然而在没有原子性保证时, 错误处理就会异常复杂, 而缺乏隔离性则容易出现并发性方面的各种奇怪问题。

如果我们期望多个操作同时成功或者失败,并且期望多组操作之间相互隔离(不相互影响),那么就需要通过一个事务来执行。

Oracle 是支持事务的。而 MySQL 中只有 InnoDB 存储引擎支持事务,MyISAM、Memory、Merge 等存储引擎都不支持事务。

使用事务有两种方式,分别为:隐式事务和显式事务。

隐式事务

隐式事务又称自动提交事务,顾名思义就是当执行完一条 SQL 语句后,会自动 commit 提交。

MySQL 默认使用的就是隐式事务。

显式事务

如果我们想关闭自动提交,可以使用下边的两种方法之一:

  • 显式的的使用 start transaction 或者 begin 语句开启一个事务。这样,在本次事务提交或者回滚之前会暂时关闭自动提交功能。
  • 把系统变量 autocommit 的值设置为 off 或者 0:set autocommit = off。这样,本次会话将关闭自动提交功能。不论是否显式的开启一个事务,每次执行事务都需要使用 commit 进行提交让事务生效,使用 rollback 对事务进行回滚。

需要注意的是:设置 autocommit 的值,只针对当前会话有效。

autocommit 参数的取值有 2 种可能:

  • autocommit = 0:取消自动提交功能
  • autocommit = 1:使用自动提交功能(默认值)

start transaction 比 begin 语句强大的一点是:可以在 start transaction 语句后面跟随几个修饰符,用来设置事务的访问模式,修饰符如下所示:

  • read only:标识当前事务是一个只读事务。即该事务内的操作只能读取数据,而不能修改数据。
  • read write:标识当前事务是一个读写事务。即该事务内的操作既可以读取数据,也可以修改数据。
  • with consistent snapshot:启动一致性读。即执行该命令后立即生成 ReadView,而不用等到第一条 select 语句执行。

如果我们想在 start transaction 后面跟随多个修饰符的话,使用逗号将修饰符分开即可,

如果不显式的指定事务的访问模式,那么该事务的访问模式默认为:读写模式。

保存点 savepoint

可以用 savepoint 保存点名称; 语句创建保存点,方便后续回滚到指定保存点。

保存点就是在事务对应的数据库语句中打几个点,我们在调用 rollback 语句时,可以回滚到指定的保存点,保留部分操作而非回滚到事务执行之前的状态。

当我们想回滚到指定的保存点时,可以使用这个语句: rollback [work] to [savepoint] 保存点名称;(单词 work 和 savepoint 可有可无)。

如果 rollback 语句后没有跟随保存点名称的话,会直接回滚到事务执行之前的状态。

如果我们想删除某个保存点,可以使用这个语句: release savepoint 保存点名称;

completion_type 参数

MySQL 中 completion_type 参数的取值有 3 种可能:

  • completion=0(no_chain),这种情况下,当我们执行 commit 的时候会提交事务,在执行下一个事务时,还是需要我们使用 start transaction 或者 begin 来开启事务。(参数的默认值)
  • completion=1(chain),这种情况下,当我们提交事务时,相当于执行了 commit and chain,也就是开启一个链式事务;即当我们提交事务之后,会开启一个相同隔离级别的事务。
  • completion=2(release),这种情况下,当我们提交事务时,相当于执行了 commit and release;即当我们事务之后,会自动与服务器断开连接。

事务的特性分别是:原子性 (Atomicity)、一致性 (Consistency)、隔离性 (Isolation)、持久性 (Durability)。

下面我们分别介绍这四个特性。

一致性:一个事务能够正确地将数据从一个一致性的状态,转换到另一个一致性的状态。

数据的一致性状态是指数据满足我们事先定义好的约束规则。也就是在事务执行的过程中,不论出现什么问题(比如停电、宕机),最终的执行结果都是满足我们事先定义好的约束规则的。

数据的一致性就是正确性。

原子性:一个事务中包含的所有操作,要么全部执行,要么一个都不执行,即 all-or nothing。

事务在执行过程中出现故障(宕机、断电、进程崩溃、某种完整性约束被违反),导致操作不能全部执行时,事务会被回滚 (Rollback) 到事务开始前的状态,就像这个事务从来没有执行过一样。

隔离性:如果多个事务并发执行,事务之间不应该出现相互影响的情况,它其实就是数据库的并发控制。

数据库试图通过事务隔离来对应用开发者隐藏,事务并发时可能出现的各种异常情况。

在实践中,由于考虑到性能的问题,会在高性能与正确性之间做一个权衡。使用者可以根据自己的业务场景,选择一个合适的隔离级别。

持久性:如果一个事务已经提交成功,那么不论出现什么问题(比如停电、宕机、存储介质发生故障、数据库崩溃),事务所写入的任何数据都不会丢失。

掘金小册《MySQL 是怎样运行的:从根儿上理解 MySQL》

Original: https://www.cnblogs.com/feiyu2/p/16654663.html
Author: 真正的飞鱼
Title: 事务的ACID特性

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/598896/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • 字节一面:事务还没提交的时候,redolog 能不能被持久化到磁盘呢?

    又是被自己菜醒的一天,总结面经看到这题目听都没听过,打开百度就像吃饭一样自然 老规矩,背诵版在文末。点击阅读原文可以直达我收录整理的各大厂面试真题 首先,咱需要明白的是,啥是持久化…

    数据库 2023年6月6日
    0125
  • java面试题(2022最新)

    JDK 和 JRE 有什么区别?JRE:Java Runtime Environment(java运行时环境)。即java程序的运行时环境,包含了java虚拟机,java基础类库。…

    数据库 2023年6月16日
    089
  • mysql索引

    MySQL索引: MySQL索引的建立对于MySQL的高效运行是很重要的,索引可以大大提高MySQL的检索速度。 1.创建索引1.1单独创建索引 1.2修改表结构创建索引 1.3创…

    数据库 2023年6月11日
    087
  • 解决pycharm问题:module ‘pip’ has no attribute ‘main’

    Pycharm安装package出现如下报错: 找到安装目录下 helpers/packaging_tool.py文件,找到如下代码: 修改如下: Original: https:…

    数据库 2023年6月6日
    0275
  • 学习笔记——Django项目中关联查询以及关联查询的筛选

    2022-10-01 关联查询: 在Django项目中使用ORM模式设置表后,进行关联查询,即两个表直接有联系的查询。 方式: 可以通过主表查询从表,也可以通过从表查询主表。 方式…

    数据库 2023年6月14日
    070
  • Java异步执行器CompletableFuture源码解析

    CompletableFuture是对 Future的一种强有力的扩展, Future只能通过轮询 isDone()方法或者调用 get()阻塞等待获取一个异步任务的结果,才能继续…

    数据库 2023年6月11日
    089
  • MySQL8.0.26的安装与配置——详细教程

    网上的教程有很多,基本上大同小异。 但是安装软件有时就可能因为一个细节安装失败。 我也是综合了很多个教程才安装好的,所以本教程可能也不是普遍适合的。 二、Mysql 配置 1.解压…

    数据库 2023年6月9日
    092
  • Spring Security OAuth 笔记

    1 单点登录 关于单点登录的原理,我觉得下面这位老哥讲的比较清楚,有兴趣可以看一下,下面我把其中的重点在此做个笔记总结 https://juejin.cn/post/6844904…

    数据库 2023年6月14日
    082
  • Docker 部署前后端项目

    Docker 部署前后端项目 平生不会相思,才会相思,便害相思。 简介:都是被逼的,从零开始一个Docker 部署九个微服务和三个前端项目。其中,这些服务需要用到Nacos、MyS…

    数据库 2023年6月14日
    086
  • Oracle 备份与恢复 (Docker部署版)

    Oracle 备份与恢复 (Docker部署版) 一,宿主机设置定时备份脚本 1.检查Oracle容器是否正常运行 docker ps 2.进入容器,创建shell脚本 #orac…

    数据库 2023年6月11日
    0100
  • Ceph创建一个新集群 报错: File “/usr/bin/ceph-deploy”, line 18, in……….

    [root@ceph-node1 ceph]# ceph-deploy new node1 Traceback (most recent call last): File &quo…

    数据库 2023年6月14日
    082
  • MySQL索引详解,面试必问

    1、什么是索引? 索引是帮助MySQL高效获取数据的数据结构(有序)。 除了数据之外,数据库系统还维护满足特定查找算法的数据结构,这些查找算法以某种方式引用(指向)数据,从而可以在…

    数据库 2023年5月24日
    0112
  • mysql基础语法_曾佳豪

    一、构建数据库、表和数据类型 [En] I. Building databases, tables and data types 1.建库 create database if n…

    数据库 2023年5月24日
    091
  • MYSQL–>视图

    视图就是一种 虚拟存在的表。因为视图的数据不在数据库中实际存在。 视图的行和列的数据都来自于 我们定义视图所使用的表 其中,定义视图所使用的表叫 基表 视图的行和列的数据是在使用视…

    数据库 2023年6月14日
    068
  • Kafdrop

    Kafdrop 是一个用于查看 Kafka 主题和浏览消费者组的 Web UI docker run -d –rm -p 9000:9000 \ -e KAFKA_BROKERC…

    数据库 2023年6月14日
    0126
  • Linux下的ssh、scala、spark配置

    注:笔记旨在记录,配置方式每个人多少有点不同,但大同小异,以下是个人爱好的配置方式. 平台:win10下的ubuntu虚拟机内 所用到的文件:hadoop-2.7.3.tarjdk…

    数据库 2023年6月16日
    0115
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球