MySQL 事务

文章目录

        • [1. 事务的执行流程](#1. 事务的执行流程)
          • [1.1 开启事务](#1.1 开启事务)
          • [1.2 执行 sql](#1.2 执行 sql)
          • [1.3 提交或回滚](#1.3 提交或回滚)
        • [2. 事务的特性](#2. 事务的特性)
          • [2.1 原子性](#2.1 原子性)
          • [2.2 一致性](#2.2 一致性)
          • [2.3 持久性](#2.3 持久性)
          • [2.4 隔离性](#2.4 隔离性)
        • [3. 并发执行事务可能会出现的问题](#3. 并发执行事务可能会出现的问题)
          • [3.1 脏读](#3.1 脏读)
          • [3.2 不可重复读](#3.2 不可重复读)
          • [3.3 幻读](#3.3 幻读)
        • [4. 隔离级别](#4. 隔离级别)
          • [4.1 read uncommitted(读未提交)](#4.1 read uncommitted(读未提交))
          • [4.2 read committed(读已提交)](#4.2 read committed(读已提交))
          • [4.3 repeatable read(可重复度)](#4.3 repeatable read(可重复度))
          • [4.4 serializable(串行化)](#4.4 serializable(串行化))

事务是为了避免出现数据不一致的情况,将多个 sql 打包成一个整体,确保这些 sql 要么全部正确执行,要么"全部都不执行"

1. 事务的执行流程
1.1 开启事务
sql 复制代码
start transaction
1.2 执行 sql
1.3 提交或回滚
sql 复制代码
commit   # 事务结束
rollback  # 回滚

回滚的实现

数据库会将所有的操作记录在日志中,回滚会依据日志进行(eg. 删除操作,回滚就是将删除的数据重新插入进去)

2. 事务的特性
2.1 原子性

事务中所包含的各种操作,要么都做,要么都不做

通过回滚的方式,保证一些列操作都能执行正确或恢复

2.2 一致性

事务执行的结果必须是使数据库从一个一致性状态变到另一个一致性状态

主要靠数据库的约束及一系列检查机制完成

2.3 持久性

一个事务一旦提交,它对数据库中的数据的改变就应该是永久性的,在硬盘上持久保存的。接下来的其它操作或故障不应该对其执行结果有任何影响。

2.4 隔离性

隔离性指的是不同事务在提交的时候,最终呈现出来的效果是串行的

数据库并发执行多个事务时(MySQL通过多线程的方式并发处理多个事务),涉及到的问题(如果希望数据库执行效率提高,就需要提高并发程度,但提高了并发程度之后,就可能会导致数据库中的数据出现错误)

两个事务之间的影响越大,隔离性越高,影响越小,隔离性越低。

隔离级别就是在数据正确和效率之间做权衡

3. 并发执行事务可能会出现的问题
3.1 脏读

两个并发执行的事务 A 和 B,事务 A 写数据的过程中,事务 B 读了数据后,事务 A 又改了数据,这时事务 B 读到的就是脏数据

解决方法:针对写来加锁(写的时候不能读),并发性降低了,隔离性提高了,效率降低了,数据准确性提高了

3.2 不可重复读

两个并发执行的事务 A 和 B,事务 A 在内部多次读取同一个数据,读到的结果不同。事务 A 在两次读的过程中,事务 B 修改了这个数据并提交了事务。

解决方法:给读来加锁(读的时候不能写)

3.3 幻读

一个事务的两次读取,数据内容没变(之前的数据内容没有任何修改),但结果集变了(增加或减少了某些数据)

A 事务第一次读完之后另一个事务 B 增加或减少了某些数据,但 A 事务的两次读取的结果集不同,且事务 A 在插入数据的时候会失败。

解决方法:串行化的执行事务

4. 隔离级别

针对并发执行事务出现的三种问题所提出的四种隔离级别

4.1 read uncommitted(读未提交)

最低隔离级别

4.2 read committed(读已提交)

引入了写加锁

4.3 repeatable read(可重复度)

引入了写加锁和读加锁(MySQL 默认隔离级别)

4.4 serializable(串行化)

串行化执行事务

相关推荐
霸道流氓气质12 分钟前
MyBatis 分页查询 + Feign 数据补充实战指南
数据库·oracle·mybatis
一起逃去看海吧12 分钟前
对接LangSmith
java·前端·数据库
wyhwust13 分钟前
web应用技术-第一次课后作业
java·前端·数据库
hef28830 分钟前
SQL角色分组统计与功能扩展实战指南
数据库
隐退山林33 分钟前
JavaEE进阶:MyBatis操作数据库(进阶)
数据库·java-ee·mybatis
我是一颗柠檬43 分钟前
【MySQL全面教学】MySQL锁机制与并发控制Day10(2026年)
数据库·sql·mysql·database
代码中介商1 小时前
B树:数据库索引的高效基石
数据结构·数据库
fen_fen1 小时前
Oracle12,新增自增主键表和批量插入数据
数据库·sql·mysql
deepin_sir1 小时前
11 - 模块与包
前端·数据库·python
念恒123061 小时前
MySQL索引
数据库·mysql