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

串行化执行事务

相关推荐
cellurw23 分钟前
Day39 SQLite数据库操作与HTML核心API及页面构建
数据库·sqlite·html
小蒜学长33 分钟前
旅行社旅游管理系统的设计与实现(代码+数据库+LW)
java·数据库·spring boot·后端·旅游
Mr_hwt_12338 分钟前
基于mybatis-plus动态数据源实现mysql集群读写分离和从库负载均衡教程(详细案例)
数据库·spring boot·mysql·mybatis·mysql集群
万邦科技Lafite1 小时前
实战演练:通过API获取商品详情并展示
大数据·数据库·python·开放api接口
黄焖鸡能干四碗1 小时前
智慧教育,智慧校园,智慧安防学校建设解决方案(PPT+WORD)
java·大数据·开发语言·数据库·人工智能
敲上瘾1 小时前
Docker 存储卷(Volume)核心概念、类型与操作指南
linux·服务器·数据库·docker·容器·架构
DemonAvenger1 小时前
MySQL内存优化:缓冲池与查询缓存调优实战指南
数据库·mysql·性能优化
RationalDysaniaer1 小时前
了解etcd
数据库·etcd
正在走向自律2 小时前
国产时序数据库选型指南-从大数据视角看透的价值
大数据·数据库·清华大学·时序数据库·iotdb·国产数据库
Pocker_Spades_A2 小时前
Python快速入门专业版(十五):数据类型实战:用户信息录入程序(整合变量、输入与类型转换)
数据库·python