事务的实现原理

news2024/11/25 6:29:23

事务的实现

  • 简介
    • 特性(ACID)
    • 状态与分类
  • 实现机制
    • 日志机制
      • redo log
      • undo log
    • 锁机制
  • 如何使用


简介

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

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

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

特性(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注解,可以让我们更好的使用

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/766001.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

企业数据治理实战总结--数仓面试必备

文章整理自涤生大数据老师宇哥,宇哥是历任中国电信,平安银行,微众银行,众安保险等多家公司擅长大数据求职面试,数仓开发管理,数据治理,数据质量等工作,主导过相关平台的建设 1 数据…

mybatis和dbeaver安装部署连接测试

ORM对象关系映射,把对象和数据库中的数据进行映射。mybatis是orm框架,mybatis-plus是mybatis的增强工具,简化开发。 1.准备mysql数据库 首先安装mysql https://dev.mysql.com/downloads/file/?id518835 设置密码:0000 然后下db…

大数据学习01-Zookeeper分布式集群部署

二、下载 zookeeper官网,本文使用的是zookeeper3.4.8版本 三、安装部署 将下载好的安装包上传至linux服务器上 解压安装包 tar -zxvf zookeeper-3.4.8.tar.gz -C /home/localzookeeper目录重命名 mv zookeeper-3.4.8 zookeeper配置环境 vim /etc/profile添加…

自定义实现list及其功能

#pragma once #include <iostream> #include <assert.h> using namespace std;namespace test {//******************************设置结点******************************template<class T>struct list_node{T _data;list_node<T>* _next;list_node&l…

SQL27 查看不同年龄段的用户明细

selectdevice_id,gender,casewhen age>25 then 25岁及以上when age>20 then 20-24岁when age<20 then 20岁以下else 其他end as age_cut from user_profile

Python property 定义与应用

目录 一、前言二、定义 一、前言 在 Python 类这一节中&#xff0c;会涉及到属性的私有化&#xff0c;私有化的好处在于我们无法轻易地更改类体中属性值&#xff0c;而对于类体中的私有化属性其实也并非真正的私有化&#xff0c;而是一种伪私有化&#xff0c;我们可通过 dir()…

71、redis主从复制的核心原理

redis主从复制的核心原来 通过执行slaveof命令或设置slaveof选项&#xff0c;让一个服务器去复制另一个服务器的数据。主数据库可以进行读写操作&#xff0c;当写操作导致数据变化时会自动将数据同步给从数据库。而从数据库一般是只读的&#xff0c;并接受主数据库同步过来的数…

Android JetPack Compose之主题的理解与使用

目录 概述1.什么是MaterialTheme2.MaterialTheme与CompositionLocal的联系2.1 MaterialTheme的工作原理2.2 CompositionLocal2.3 CompositionLocal的两种创建方式2.3.1 compositionLocalOf2.3.2 staiticCompositionLocalOf 2.4 CompositionLocal总结 概述 根据百度百科知识&am…

Springboot + Vue 上传Word文档并保留内部格式

因为业务需求&#xff0c;上传Word文件需要编辑&#xff0c;但如何使用Blob方式&#xff0c;在数据库里存文件&#xff0c;就会造成格式消失。所以修改思路&#xff1a;上传文件到服务器本地&#xff0c;保证数据存储的完整性。 前端 <el-upload class"upload-demo&quo…

复习PHP基础教程

PHP 安装 PHP 简介PHP 语法 我需要什么&#xff1f; 如需开始使用 PHP&#xff0c;您可以&#xff1a; 使用支持 PHP 和 MySQL 的 web 主机在您的 PC 上安装 web 服务器&#xff0c;然后安装 PHP 和 MySQL。 使用支持 PHP 的 Web 主机 如果您的服务器支持 PHP&#xff0c…

基数排序|RadixSort|C++实现

前言 那么这里博主先安利一些干货满满的专栏了&#xff01; 首先是博主的高质量博客的汇总&#xff0c;这个专栏里面的博客&#xff0c;都是博主最最用心写的一部分&#xff0c;干货满满&#xff0c;希望对大家有帮助。 高质量干货博客汇总https://blog.csdn.net/yu_cblog/c…

电商 api 接口文档

电商 api 接口文档 1、开篇 欢迎使用ShowDoc&#xff01; API格式&#xff1a; 备注&#xff1a;电商API必须返回如下3个字段&#xff1a; 参数名必选类型说明status是int状态message是string信息提示result否mix结果 2、用户相关 2.1、登录/退出 简要描述&#xff1a; …

【复盘】记录一次类型不一致导致的Kafka消费异常问题

背景 业务主要是通过A系统向B系统写入Kafka&#xff0c;然后B系统消费Kafka 将结果写到Kafka中&#xff0c;A进行消费最终结果。 在整个流程中&#xff0c;A写入Kafka会写入一张 record1表记录&#xff0c;然后在A消费最终结果的时候也记录一张record2表。主要改动的话 只是B系…

从Web2到Web3:区块链技术的未来前景

随着互联网的发展&#xff0c;Web1.0、Web2.0 和 Web3.0 成为了人们口中津津乐道的话题。那么&#xff0c;这三种网络时代究竟有什么区别呢&#xff1f; Web1.0 是一个只读的时代&#xff0c;那个时候&#xff0c;用户只能浏览网页&#xff0c;无法进行互动和创作。Web2.0 则是…

什么是社会智商?24种人格力量之社会智商的力量

什么是社会智商&#xff1f; 社会智商指的是将人的智力具体化&#xff0c;自己对他人的了解以及自我剖析能力的高低。一般而言&#xff0c;社会智商越高&#xff0c;对他人的观测能力越高&#xff0c;自我剖析就越透彻。社会智商来源于via 24种人格力量&#xff0c;是人格的优…

FPGA实现UART协议的接收与发送

一、接收模块uart_rx.v UART协议&#xff0c;空闲时&#xff0c;TX和RX数据线都是通过上拉电阻拉高的状态&#xff0c;这样才能在起始位到来时检测到一个下降的边沿。 UART数据格式 uart_rx.v模块输入输出示意图 RX_start。首先&#xff0c;找到起始位的开始时刻RX_start&…

在程序员从业生涯中,哪本书让你醍醐灌顶?

推荐《程序员的README》 [美] 克里斯里科米尼&#xff08;Chris Riccomini&#xff09; 著&#xff0c;付裕 译 每名新入行的工程师在开始工作之前要阅读的书&#xff01;10年大型公司初级工程师指导经验的行业大咖教你如何开启职业生涯、扩展工作技能、应对糟糕管理&#xff0…

信音电子在创业板IPO:募资约9亿元,预计上半年收入约4.3亿元

7月17日&#xff0c;信音电子&#xff08;中国&#xff09;股份有限公司&#xff08;下称“信音电子”&#xff0c;SZ:301329&#xff09;在深圳证券交易所创业板上市。本次上市&#xff0c;信音电子的发行价为21.00元/股&#xff0c;发行数量为为4300万股&#xff0c;募资总额…

Java 压缩多个文件为zip包(中间不生成临时文件,直接压缩为zip二进制流),以及解压zip包二进制流为文件

Java 压缩多个文件为zip包及解压zip包以及压缩多文件为zip文件流解压zip二进制流&#xff08;中间不生成临时文件&#xff0c;直接压缩为zip二进制流&#xff0c;并验证解压&#xff09; 1. 效果图2. 源码 这篇博客将提供俩种方法&#xff0c; 提前生成要压缩的多个文件&#…

vscode debug的方式

在.vscode文件夹下建立launch.json 例子1&#xff1a;调试python 来自 https://github.com/chunleili/tiPBD/tree/amg {"version": "0.2.0","configurations": [{"name": "hpbd 5 5","type": "python&quo…