事务的实现原理

2023-11-14


简介

       有许多小伙伴初学事务还不太清楚是干什么的,那么我们在简介中一次性将事务给搞懂

       首先我们先来简单的说一下事务是什么,以便更好的去了解它用通俗的概念来讲:事务就是一组最小的执行逻辑单元,可以使数据从一种状态转到另一种状态。

       根据上面的概念,我们就可以推断出它是操作的数据,并且这组数据的状态只能有两种状态,那么就是要么操作成功,要么操作失败。那么我们就可以总结出如下四个特性

特性(ACID)

  1. 原子性(atomicity)
    这组操作不能被分割,因为已经是最小执行单元了。

  2. 一致性(consistency)
    事务执行前后,数据从一个合法状态转化为另外一个合法状态。

  3. 隔离性(isolation)
    既然上面所说它是一个单元,那么这个事务在执行的时候就不会被其他的干扰到。

  4. 持久性(durability)
    操作数据之后,那么这个操作完成之后就会被保存,在这里我们用提交来说明这个操作一旦提交之后,就会被保存起来。

状态与分类

       上面在讲到它的特性时候我们提了一下它的状态只有固定的几种,那么下面展开讲讲它的几种状态。
事务状态图

  1. 活动
    活动也就是我们开始事务前的准备工作,这个时候我们将已经准备好的数据或操作要进行一个持久化操作。

  2. 部分提交的
    在我们的事务中可能会包含许多的逻辑,那么这些逻辑如果全部执行完成我们就将这些状态称为部分提交的,但是到这里还是不算完成。

  3. 提交的
    最后将上面完成的数据都保存到磁盘中,也就完成了我们的最后要的操作,这里我们就提交事务,标志着一个事务的完成。

  4. 失败的
    当我们在提交的过程中遇到了什么问题,或者在最后要完成持久化操作中遇到了问题,那么就会来到失败的操作。

  5. 终止的
    如果到这里,那么这个操作算是没有完成的,我们就需要将它进行恢复到原来的状态,这个操作我们称为回滚,然后就到了这个中止状态。

实现机制

       上面我们看了,有那么多状态,进行这些操作的一般都是要对后台或者数据库进行操作(这里通常只有Mysql的Innodb才会去支持),那么需要实现上面的这些内容我们就需要一套较复杂的机制来操作。

日志机制

       日志在这当中就启到了非常重要的作用:redo log与undo log,本篇博客我就不展开细讲这两种的具体实现,只做一个简单的概述。

redo log

       首先在我们保存的Mysql数据库,它是由许多数据页来保存的,而每个数据页的大小有16kb,如果我们每一次都去操作数据页,那么就会照成频繁I/O这样对性能的损耗较大。那么这个时候redolog就登场了,我们每一次操作,就会被记录在redolog当中,这样即不会去担心宕机之后数据会丢失,也不会因为频繁的去操作数据页而照成性能阻塞。

       这里可能会有小伙伴有疑问了,那么我们频繁的去写入日志,不也会照成性能的下降嘛,那么这里同样的也会在写入日志的时候加入一层redo log buffer,当达到一定的条件的时候,我们就会将日志在保存,这里俗称刷盘。那么这里的刷盘策略是可以设置的 innodb_flush_log_at_trx_commit

  1. = 0
    事务提交的时候,不会被刷盘,而是每隔1s自动同步日志
  2. = 1
    每次提交事务就会刷盘(这个也是Innodb默认设置的)
  3. = 2
    表示将内容写入到日志中也就是redo.file
    当然实际情况也挺复杂的,并且都是独立的线程,尽可能的减少对性能的影响

undo log

       这个日志的出现主要就是为了解决上面状态出现需要回滚的时候该如何去处理的。

       当我们去对这条记录进行改动的时候,undolog就会将这条插入的语句给保存起来,然后当需要回滚的时候,在执行上面的这些操作。
       改动的内容一般有:语句的主键、插入、修改、删除

锁机制

       那么这里的锁就很好理解了,就是将为了保证事务的原子性,在进行这个操作的时候,这个线程会被占用,而针对不同的业务需求又有不同需要,比如我们常说的应对脏读、幻读、不可重复读等。对此也设置了相应的隔离级别。

如何使用

       那么上面我们说了这么多,为什么要使用事务呢,他能为我们提供什么价值?

  • 首先最简单的就是它为数据提供了安全的操作,避免在多线程环境下的数据并发问题
  • 而在我们java开发中,会有使用到@Transactional注解,可以让我们更好的使用
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

事务的实现原理 的相关文章

随机推荐

  • 消息队列中间件 - Docker安装RabbitMQ、AMQP协议、和主要角色

    概述 不管是微服务还是分布式的系统架构中 消息队列中间件都是不可缺少的一个重要环节 主流的消息队列中间件有RabbitMQ RocketMQ等等 从这篇开始详细介绍以RabbitMQ为代表的消息队列中间件 AMQP协议 AMQP协议是一个提
  • Python使用plot()函数画图进阶使用

    目录 使用介绍 plot 函数进阶使用 1 全局信息代码 2 绘图代码 1 画布设置 2 函数传入参数设置 3 函数内部代码解读 4 函数调用 5 plt tight layout 函数的使用 6 最后做出图形如下 使用介绍 在前文 Pyt
  • 读书:《素书新解》(一)

    黄石公的 素书 分六章 原始 正道 求人之志 本德宗道 遵义 安礼 共132句 1636字 夫道 德 仁 义 礼 五者一体也 我问了一下ChatGPT 给出五者的更详细的解释 道 德 仁 义 礼是中国传统文化中的重要概念 它们代表了人们追求
  • 多线程 并发编程与异步方法

    1 Parallel Programming中的PLINQ Parallel Class与Task Parallelism的特点 并发编程的内容类似于Google的Map Reduce的算法 多线程的着眼点是线程的互斥 同步等 而并行编程的
  • c++语言常量,C++常量(constant)

    在程序执行过程中 其值不能改变的量称为常量 Constant 普通常量的类型是根据数据的书写形式来决定的 如 100 是整型常量 0 5 是实型常量 q 是字符型常量 qianfeng 是字符串常量 1 整型常量 在 C 中 使用的整型常量
  • 计算机网络体系结构2

    1 计算机网络体系结构 由 网络协议 构成 规定了所交换的数据的格式 规定了所交换的数据的时序 数据内容所表示的含义等方面的内容 2 网络协议三要素 语法 数据与控制信息的结构或格式 语义 需要发出何种控制信息 完成何种动作以及做出何种响应
  • 703n无法进入路由管理界面reset无效重刷方法

    现在没法接网线获取不到地址 winscp也登不了 请问除了ttl线外不拆机能重刷吗 安全模式恢复 具体方法如下 网线连接电脑和703n 设置电脑ip地址为192 168 1 2 掩码默认 网关192 168 1 1 电脑 gt 开始 gt
  • 沐风老师3DMAX厨房橱柜生成器KitchenCabinetGenerator教程

    3DMAX厨房橱柜生成器插件使用方法 3DMAX橱柜生成器KitchenCabinetGenerator是一个在3dMax中自动创建三维橱柜模型的高效脚本 它有多种风格的台面 门和橱柜 可以灵活地应用于Archviz项目 同时为3D艺术家节
  • 分支算法应用2--快速排序

    快速排序 快速排序就是将一个需要排序的数组A a0 a n 1 顺序排列输出 首先从数组中随便找到一个元素x 然后将小于这个元素x的所有元素放到这个元素左边 将大于这个元素x的所有元素放到这个元素的右边 最后运用递归再对x左边和右边的元素进
  • Java使用有限状态机算法实现判断字符串是否合法

    题目描述 请根据给出的正则表达式来验证邮箱格式是否合法 如果用户输入的格式合法则输出 邮箱格式合法 否则输出 邮箱格式不合法 正确格式对应的正则表达式 a zA Z0 9 a zA Z0 9 a zA Z0 9 输入 123123 nowc
  • 做测试不会 SQL?超详细的 SQL 查询语法教程来啦!

    前言 作为一名测试工程师 工作中在对测试结果进行数据比对的时候 或多或少要和数据库打交道的 要和数据库打交道 那么一些常用的sql查询语法必须要掌握 最近有部分做测试小伙伴表示sql查询不太会 问我有没有sql查询语法这一块的文档可以学习
  • Linux CentOS7 系统中添加用户

    在linux centOS7系统中 添加用户是管理员的基本操作 作为学习linux系统的基本操作 对添加用户应该多方面了解 添加用户的命令useradd 跟上用户名 就可以快速创建一个用户 添加一些选项 可以设置更人性化的用户信息 本文从三
  • 数据结构—二叉树的构造

    pre class cpp 线索化二叉树 1 中序线索化二叉树 2 遍历线索化二叉树 include pre
  • Mac 中英文输入法切换快捷键caps lock失效解决办法

    使用mac的时候一直是通过caps lock快捷键进行中英文切换的 主要是在linux上使用vim修改程序的时候需要是英文的输入法 但是最近发现 使用caps lock快捷键切换时没反应 只能通过手动改中英文输入法 很是麻烦 查看系统设置也
  • IndexError: tuple index out of range

    1 如果想把CUDA tensor格式的数据改成numpy时 需要先将其转换成cpu float tensor随后再转到numpy格式 numpy不能读取CUDA tensor 需要将它转化为 CPU tensor 2 predicted
  • numpy tolist()的用法

    1 将数组或者矩阵转换成列表 如下 gt gt gt from numpy import gt gt gt a1 1 2 3 4 5 6 a1是列表 gt gt gt a2 array a1 列表 gt 数组 gt gt gt a2 arr
  • linux usb系统【全面】

    转自 http blog csdn net ljzcom article details 8574411 1 简述 USB 出自豪门 一问世便有 IBM Microsoft compaq 等前呼后拥 不红实在是没有道理 以致于连三岁小毛孩都
  • 利用Git连接远程仓库(详细步骤)

    利用Git连接远程仓库步骤及常见问题 1 先创建一个文件夹 名字为远程仓库的名称 2 在该文件目录下打开Git Bash 3 输入git init 进行初始化 初次连接时 4 连接远程仓库 初次连接是下一次进入该文件夹就不用了 输入下列命令
  • [528]attrib隐藏文件夹

    综述 小伙伴们总要有一些秘密是不能让别人知道的 之前我们使用的设置隐藏文件夹然后在控制面板设置不显示隐藏文件夹的方式都弱爆了 下面我们来用一种更高级的办法来设置隐藏文件夹 感受一下 设置隐藏 首先我们创建一个文件夹 比如名字叫 SECRET
  • 事务的实现原理

    事务的实现 简介 特性 ACID 状态与分类 实现机制 日志机制 redo log undo log 锁机制 如何使用 简介 有许多小伙伴初学事务还不太清楚是干什么的 那么我们在简介中一次性将事务给搞懂 首先我们先来简单的说一下事务是什么