代码编织梦想

一、什么是事务

        事务一般是指要做的或所做的事情,在计算机术语中是指访问并可能更新数据库中各种数据项的一个程序执行单元。

        比如在现实生活中,经常进行转账操作,分为两个步骤:转入与转出,只有当两部分都完成才认为转账成功。如果其中任意操作异常没有执行成功,则会导致两账户的金额不同步,造成错误,为了避免上述错误,数据库引入事务。

二、事务执行流程

         ①查询操作先从Buffer Pool中查询数据,若存在则直接输出,不存在则读取磁盘中的数据并放入Buffer Pool。

        ②在操作任何数据之前,会先将数据的旧值写入undo log日志文件中,以便执行事务过程中出现异常后好回滚到事务执行之前的数据。

        ③然后再操作Buffer Pool(内存)中的数据并设置成脏页,同时将操作的数据写入到Redo Log Buffer。

        ④将Redo Log Buffer中的数据写入到os cache系统内核缓存中。

        ⑤系统内核调用fsync()将os buffer中的数据写入到redolog文件中,并设置状态为prepare。

        ⑥redolog文件写入完成后,由server层将执行的操作性修改,包括数据库结构和表数据的变更,但不包括select语句,写入到binlog文件中。

        ⑦binlog写入成功后,设置状态为commit。

        ⑧最后完成事务提交。

        脏页什么时候会被刷入磁盘

        一般来说,当事务提交后,MySQL首先更新的是 Buffer Pool 中数据所在的页,然后将该页设置为脏页,但是磁盘中还是原数据。因此,脏页需要被刷入磁盘,以保证缓存和磁盘数据一致,但是若每次修改数据都刷入磁盘,则性能会很差,因此一般都会在一定时机进行批量刷盘。数据刷盘的时机有以下几种:

        ①当 redo log 日志满了的情况下,会主动触发脏页刷新到磁盘。

        ②Buffer Pool 空间不足时,会先将脏页刷新到磁盘。

        ③MySQL 认为空闲时,后台线程回定期将适量的脏页刷入到磁盘。

        ④MySQL 正常关闭之前,会把所有的脏页刷入到磁盘。

三、事务特性

        事务4 个特性:原子性、一致性、隔离性、持久性。

        ①原子性(atomicity)

        原子性是指事务中的所有操作要么全部成功,要么全部失败,不会出现部分成功部分失败的情况。如果事务在执行过程中发生了错误,那么事务会回滚(rollback),即撤销已经执行的操作,恢复到事务开始之前的状态。MySQL通过使用回滚日志(undo log)来实现原子性,回滚日志记录了事务中对数据的修改,如果事务失败,就可以根据回滚日志恢复数据。

        ②一致性(consistency)

        一致性是指事务在执行前后必须保持数据的一致性,即不会破坏数据的完整性和业务逻辑。例如,在转账事务中,转出账户和转入账户的总金额应该保持不变。MySQL通过使用锁(lock)来实现一致性,锁可以防止多个事务同时修改同一条数据,造成数据冲突或丢失。

        ③隔离性(isolation)

        隔离性是指多个事务之间相互隔离,不会互相影响。例如,在转账事务中,转出账户的余额应该只受到本事务的影响,而不受到其他事务的影响。MySQL通过使用隔离级别(isolation level)来实现隔离性,隔离级别定义了一个事务在读取数据时能够看到其他事务对数据所做的修改的程度。MySQL支持四种隔离级别,分别是未提交读(read uncommitted)、已提交读(read committed)、可重复读(repeatable read)和可串行化(serializable),它们从低到高提供了不同程度的隔离性和并发性。

        ④持久性(durability)

        持久性是指事务一旦提交(commit),那么对数据所做的修改就会永久保存在数据库中,即使发生系统崩溃或断电等异常情况,也不会丢失数据。MySQL通过使用重做日志(redo log)来实现持久性,重做日志记录了事务对数据所做的修改,如果系统崩溃或断电,就可以根据重做日志恢复数据。

四、事务隔离级别

①事务隔离级别重置

        MySQL InnoDB存储引擎默认的事务隔离级别是可重复读(REPEATABLE READ)

MySQL 5.7 SELECT @@tx_isolation;

MySQL 8.0 SELECT @@transaction_isolation;

-- 设置当前会话 或者 全局隔离级别语法

SET [SESSION | GLOBAL] TRANSACTION ISOLATION LEVEL

{READ UNCOMMITTED | READ COMMITTED | REPEATABLE READ | SERIALIZABLE}

②事务隔离级别介绍

        以下面表为例简单介绍MySQL各个事务隔离级别执行情况

CREATE TABLE `test1` (

  `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键',

  `name` varchar(20) NOT NULL DEFAULT '' COMMENT '姓名',

  `age` tinyint NOT NULL DEFAULT '0' COMMENT '年龄',

  `card_no` varchar(30) NOT NULL COMMENT '身份证号',

  `base_info` text COMMENT '基础信息',

  PRIMARY KEY (`id`),

  UNIQUE KEY `test1_card_no_IDX` (`card_no`) USING BTREE,

  KEY `test1_age_IDX` (`age`) USING BTREE

) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb3 COMMENT='测试1';

  • 读未提交 (READ UNCOMMITTED)

        最低级别,允许一个事务读取另一个事务尚未提交的数据。这可能导致脏读、不可重复读和幻读的问题。

事务A

事务B

begin;

begin;

update test1 set name='特朗普是懂王' where id=1;

commit;

update test1 set name=’拜登走路要摔倒’where id=1;

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/chengxuyuan_2012/article/details/136793144

终于搞懂Mysql事务及实现原理-爱代码爱编程

对于Mysql的事务,想必大家应该都不陌生,我们也容易联想到几个名词:ACID,要不都成功,要不都失败等等。其实我们在实际的开发过程中,一般也都会用到事务处理,如:在spring框架中相关事务的注解:@Transactional等,这里我们就展开了. 一、什么是事务(百度百科的定义) 在计算机术语中是指访问并可能更新数据库中各种数据项的一个程序执

mysql事务及其实现原理--MVCC--二阶段提交-爱代码爱编程

目录  1 概述  2 四大特性 2.1 原子性 2.2 隔离性 2.2.1 MVCC 2.2.2 undolog---MVCC 2.2.3 Read View---MVCC 2.3  持久性 2.3.1 二阶段提交 2.4 一致性 1 概述          相信大家刚接触mysql的时候,就知道mysql事务的四个特点,原子

mysql事务的实现原理-爱代码爱编程

核心日志 1、Redo Log 2、Undo Log 3、BinLog redoLog,保持继续执行恢复没有写入的功能日志,物理日志,innoDB独有。 undoLog,回滚操作,生成与执行相反的逻辑日志,且提前会有快照放在undoLog里面,有备份。 BinLog,二进制日志,mysql自身日志,主要是主从复制,数据恢复(使用mysq

mysql事务及实现原理全面总结,再也不用担心面试_mysql事务的实现原理-爱代码爱编程

一. 事务transanction的四个基本要素 简单来说,事务就是要保证一组数据库操作,要么全部成功,要么全部失败,它具有以下四个基本要素。 ACID:原子性(Atomicity)、             一致性(Correspondence)、             隔离性(Isolation)、             持久性(Dura

js遇到需要正则匹配来修改img标签+清除行内样式-爱代码爱编程

方法一 var regex0 = new RegExp("(i?)(\<img)([^\>]+\>)", "gmi") //正则匹配表达式 this.newcontent = this.content.replace(regex0,"$2 style='display:block;margin: auto;width:120px;'

mysqls事物基本概念-爱代码爱编程

事务的特性(ACID): 原子性:构成事务的所有操作要么全部成功,要不全部不成功一致性:事务执行之前和执行之后,数据始终保持一致隔离性:并发执行的两个事物之间互不干扰持久性:事物对数据的更改操作会被持久化到数据库中,并且不会被回滚 事物的类型: 偏平事物:操作中最常见、最简单、主流的数据库都支持带有保存点的扁平事物:事务回滚能回滚到指定的保存点链式事

【golang】 mysql 在 go 语言驱动程序中常用参数-爱代码爱编程

文章目录 前言一、参数解释二、代码实现四、总结 前言 在 Go 语言中,我们使用数据库驱动程序来连接和操作数据库。对于 MySQL,我们通常使用 go-sql-driver/mysql 驱动程序

python学习-爱代码爱编程

核心代码 # 导入pandas库 import pandas as pd # 导入正则表达式包 import re # 指定Excel文件的路径,这个data.xlsx表为原始表,表内有40个sheet子表 file_p

mysql-爱代码爱编程

1、适合创建索引的情况 1.1、字段数值具有唯一性的限制 索引本身是具有约束作用的,比如创建唯一索引、主键索引在数据表中如果某个字段是唯一性的,可以创建唯一性索引或主键索引 在业务场景中具有唯一特性的字段,即使是

【mysql】mvcc-爱代码爱编程

MVCC 什么是MVCC快照读与当前读快照读当前读 事务隔离级别隐藏字段、Undo Log版本链MVCC实现原理之ReadView设计思路ReadView规则MVCC操作流程 举例说明在READ C

快速理解mysql null的10大坑-爱代码爱编程

创建表时应当设置not null,添加一个默认值0或’'去替代null。 sum(‘field’)的坑 若一列的所有值都是null,那么sum函数的结果不是0,而是null,所以可能会因为值的类型兼容问题,出现意料之外的