当前位置: 首页 > news >正文

MySQL事务及其原理

事务是一组操作的集合,这组集合要么同时成功,要么同时失败

MySQL事务默认是自动提交的,也就是说每一条sql语句就是一条事务

查看/设置事务提交方式

关闭自动提交只有在其所在的查询窗口有效

select @@autocommit;   --查看提交方式
SET @@autocommit = 0;  -- 关闭自动提交
SET @@autocommit = 1;  -- 开启自动提交(默认)

提交事务/回滚事务

关闭自动提交后,只有提交事务,修改才真正到数据库

COMMIT;  -- 提交事务ROLLBACK;  -- 回滚事务

开启事务

START TRANSACTION;

事务的控制有两种方式

  1. 关闭事务自动提交
  2. 开启事务

事务四大特性(ACID)

  • 原子性:要么都成功要么都失败
  • 一致性:数据保持一致
  • 隔离性:不受其他并发操作影响
  • 持久性:事务提交或回滚对数据库中数据的改变是永久的

并发事务问题

  1. 脏读​​:一个事务读取到其他事务未提交的数据
  2. ​不可重复读​​:同一事务内多次读取同一数据结果不同,由于另一个事务提交了修改事务
  3. ​幻读​​:一个事务按条件查询数据时,没有对应的数据行,但在插入数据时,又发现这行数据已经存在了(被另一个事务插入并提交了),好像出现了幻影
  4. ​更新丢失​​:两个事务同时更新同一数据,后提交的覆盖先提交的

事务的隔离级别

MySQL支持四种事务隔离级别:

  1. ​读未提交(Read Uncommitted)​​:最低级别,可能读取到未提交的数据(脏读)
  2. ​读已提交(Read Committed)​​:Oracle默认级别,只能读取已提交的数据,但可能出现不可重复读
  3. ​可重复读(Repeatable Read)​​:MySQL默认级别,保证同一事务多次读取结果一致
  4. ​串行化(Serializable)​​:最高级别,完全串行执行,避免所有并发问题。一个事务执行完后才能执行下一个事务

 查看事务隔离级别

-- 查看全局隔离级别
SELECT @@global.transaction_isolation;-- 查看当前会话隔离级别
SELECT @@transaction_isolation;

设置事务隔离级别

--设置当前会话事务隔离级别SET SESSION TRANSACTION ISOLATION LEVEL level_name;--其中level_name可以是以下四种之一:
--READ UNCOMMITTED (读未提交)
--READ COMMITTED (读已提交)
--REPEATABLE READ (可重复读,MySQL默认级别)
--SERIALIZABLE (串行化)

两个客户端设置隔离级别,两个开启事务,当隔离级别为Read Uncommitted时,A事务可以读到B事务还没提交的数据。

两个客户端设置隔离级别,两个开启事务,当隔离级别为Repeatable Read时,A事务读到的数据不会改变,B改变了数据并提交了,只有A在提交事务后查询才能看见被B修改的数据

事务原理

原子性、一致性、持久性由innoDB存储引擎底层两份日志实现的undo log、redo log

隔离性由innoDB存储引擎的锁机制,MVCC实现的

redo log重做日志-实现一致性

执行操作时,先去缓冲池里找有没有对应的数据

没有,缓冲池通过后台线程从磁盘中读取出来,再会缓存到内存buffer pool中

然后直接操作缓冲池中的数据,缓冲池中的数据发生了变更,但是磁盘中的数据还没有,

这是缓冲池中的数据页叫脏页,脏页在一定时机通过后台线程刷新回磁盘。这样缓存和磁盘中的数据就保持了一致。

但是脏页刷新不是实时的,是有一段时间的,如果刷新出现问题

redo log :在对缓存池中的数据叶操作时,首先将操作记录到redolog中,再持久化到磁盘中

undo log回滚日志-实现原子性

记录数据被修改前的信息,作用还包括:事务执行失败时提供回滚,MVCC多版本并发控制

当执行delete时,记录insert。当执行update时,记录一条反向update语句

http://www.xdnf.cn/news/730279.html

相关文章:

  • 【Java】mybatis-plus乐观锁-基本使用
  • 高效微调大模型:LoRA技术详解
  • python里的Matplotlib库
  • C#面试问题41-60
  • 嵌入式(1):STM32 GPIO与AFIO深度解析:从原理到高阶应用实战
  • YOLO使用SAHI进行小目标检测
  • 深度剖析Node.js的原理及事件方式
  • AgenticSeek,开源本地通用AI Agent,自主执行任务
  • 从零开始手写一个Promise,彻底理解异步编程的核心原理
  • 如何获取Minio元数据
  • 每日八股文5.30
  • 谷云科技发布业内首份 Oracle OSB 迁移到 iPaaS 技术白皮书
  • 40. 自动化异步测试开发之编写异步业务函数、测试函数和测试类(类写法)
  • Delphi读写Mifare Desfire Ev1 Ev2 EV3卡修改AES密钥源码
  • 39. 自动化异步测试开发之编写异步业务函数、测试函数和测试类(函数写法)
  • 逆向分析基础总结
  • HTML 文件反编译指南:优化与学习网页代码
  • 【容器docker】启动容器kibana报错:“message“:“Error: Cannot find module ‘./logs‘
  • STUSB4500 PPS(PD3.0)快充SINK模块——应用 解析
  • [学习] C语言的回调函数(代码示例)
  • 数据基座觉醒!大数据+AI如何重构企业智能决策金字塔(下)
  • 【Linux 学习计划】-- 命令行参数 | 环境变量
  • 【目标检测】【AAAI-2022】Anchor DETR
  • 【Golang进阶】第八章:并发编程基础——从Goroutine调度到Channel通信实战
  • Redis持久化机制
  • MPC5744P——eTimer简介
  • Github 2025-05-30Java开源项目日报Top10
  • 《深入解析Go语言结构:简洁高效的工程化设计》
  • 基于 KubeKey 3.1.9,快速部署 K8s 1.33.0 高可用集群
  • Java复习Day23