数据库事务管理
- 数据库引擎
- 事务
- 事务特点
- 事务的隔离级别
- 事务的隔离级别产生的问题
数据库引擎
数据库引擎 | 特点 | 事务支持 |
---|---|---|
InnoDB (默认引擎) | 支持事务、支持行级锁、支持外键 | ✔ |
MyISAM | 支持表级锁 | ❌ |
MEMORY | 基于内存的表、适合于 临时表的定义 | ❌ |
事务
概念: 事务是为了保证业务操作的完整性、一个业务的操作要么全部成功,要么全部失败,不允许部分成功,部分失败
事务的特点ACID
-
**Atomicity **原子性
-
**Consistency **一致性
-
Isolation 隔离性
-
Durability 持久性
事务的最终目的是为了保证数据的一致性
事务的隔离级别
- 读未提交 Read uncommitted
- 读已提交(Read committed)Oracle默认隔离级别
- 可重复读(Repeatable read)MySQL默认隔离级别
- 序列化读(Serializable)
事务的隔离级别产生的问题
- 读未提交 会产生 脏读(最严重的), 不可重复读、幻读
脏读: 读取到了一个没有进行提交的数据
- 读已提交 会产生 不可重复读 和 幻读
不可重复读: A 事务 第一读取完数据、在第二次读取数据的时候, B事务 对数据进行了修改,导致 A 事务 前后读取的数据不一致
- 可重复读 : 解决了 不可重复读的问题,但 仍旧会产生 幻读现象
幻读:A 事务 第一次读取完数据(统计)、在第二次读取数据的时候, B事务 在表中新增了一条数据,导致 A事务 读取的数据前后不一致
隔离级别 | 脏读 | 不可重复读 | 幻读 |
---|---|---|---|
r✔ead uncommitted | ✔ | ✔ | |
read committed | ❌ | ✔ | ✔ |
repeatable read | ❌ | ❌ | ✔ |
serializable | ❌ | ❌ | ❌ |
设置 手动提交
set autocommit = 0 ;
-- 查看 提交方式
select @@autocommit ;
MySQL8 设置隔离级别
set session transaction isolation level read committed ; -- 设置 会话窗口 隔离级别为 读已提交
set global transaction isolation level read committed ; -- 设置全局 隔离级别
-- 查看隔离级别
select @@transaction_isolation ;