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

串行化执行事务

相关推荐
小白说大模型1 小时前
AI驱动的个性化学习路径:知识图谱与知识点关联的存储与推理
大数据·人工智能·学习·mysql·机器学习·prompt·知识图谱
这个DBA有点耶1 小时前
多模数据库深度解读:从“多库拼装”到“一库多能”的架构演进
数据库·mysql·dba
程序员夏洛2 小时前
MySQL 默认的事务隔离级别是什么?为什么选择这个级别?
数据库·mysql
艺术留白2 小时前
MokaTest使用篇-SQL接口
数据库·sql
卓怡学长2 小时前
w180springboot基于Java的悠扬乐器管理
java·spring boot·mysql·spring·maven·intellij-idea
( •̀∀•́ )9203 小时前
MySQL 自动备份与恢复方案
数据库·mysql·oracle
这个DBA有点耶3 小时前
大事务的“事前预防”:监控、拦截、Kill,四层防线一次讲透
数据库·mysql·代码规范
tachibana23 小时前
RAGAS 指标解读
数据库·人工智能·算法·机器学习·架构·大模型·llm
mlidongfeng4 小时前
[AI][昇腾950]TA 学习
数据库·学习
bestsun9994 小时前
rac集群环境下配置JDBC
数据库