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(串行化)

串行化执行事务

相关推荐
SelectDB4 分钟前
同等资源下 Apache Doris 4.2 vs StarRocks 4.1.1:1TB SSB 与 TPC-H 性能实测
大数据·数据库·数据分析
这个DBA有点耶12 分钟前
数据库集群与分布式架构:三条技术路线对比、金仓KES RAC实测数据与决策框架
数据库·程序员·架构
MayBaymax24 分钟前
MongoDB 索引与事务
java·数据库·mongodb
SelectDB27 分钟前
Doris vs ClickHouse:企业 OLAP 走向下一阶段,两种技术路线如何选择
大数据·数据库·数据分析
vx-程序开发31 分钟前
【计算机毕设】django校园跑腿服务系统83141
java·数据库·vue.js·spring boot·spring·elasticsearch·django
&不羁之风&1 小时前
从 MySQL 到 MongoDB:80 万系统日志(sys_log)平滑迁移完整实战(含 Windows 环境 mongoimport 安装与避坑)
mysql·mongodb
一 乐1 小时前
养老院管理系统|基于springboot + vue养老院管理系统(源码+数据库+文档)
java·数据库·vue.js·spring boot·毕业设计
这个DBA有点耶2 小时前
InnoDB页结构深入:页分裂、页合并、填充因子——B+树底层机制全解析
数据库·mysql·架构
山岚的运维笔记2 小时前
mysql 专业笔记 -- 第 36 章:MySQL 管理
运维·数据库·笔记·后端·mysql·oracle·dba
阳光宅男@李光熠3 小时前
【电子通识】一起学习TDK的EMC基础——电池兼容设计方法概述
java·前端·数据库