数据库事务理解
数据库事务是一种本地的刚性事务,特点是必须支持’ACID’四个特性
ACID理论
名称 | 描述 |
---|---|
原子性(Atomicity) | 指的是在事务是最小的不可分割的执行单元,事务内的操作要么都成功,要么都失败 |
一致性(Consistency) | 指的是在事务执行前后数据上的完整性保存一致,不会因为数据库事务的执行结果(成功/失败)而改变数据在业务模型上的完整性 |
隔离性(isolation) | 指的是每个事务都有单独的操作空间,不能在事务期间相互影响 |
持久性(Durability) | 指的是事务完成后对数据库的改变是以落盘结束的 |
数据库的隔离级别
隔离级别 | 描述 |
---|---|
Read Uncommitted(未提交读) | 能够读取到其他事务尚未提交的数据 |
Read committed(读取已提交内容) | 只能读取事务已提交的数据, |
Repeatable Read(可重读) | 指的是在同一个事务中任意时间节点读取到的内容一致 |
Serializable(串行化) | 指的是事务是以串行化执行 |
事务异常
异常 | 描述 |
---|---|
脏读(Dirty Read) | 指的是读到了未提交的数据 |
不可重复读(Not Repeatable Read) | 指的是在一个事务的过程中,前后读取到的数据行不一致 |
幻读 | 指的是在一个事务中读取到的数据行不一致 |
- 不可重复读指的是对数据的删除、更新操作
- 幻读指的是对数据的inster操作
数据库的隔离级别
- √为会发生,×为不会发生
隔离级别 | 脏读 | 不可重复读 | 幻读 |
---|---|---|---|
read uncommitted(未提交读) | √ | √ | √ |
read committed(提交读) | x | √ | √ |
repeatable read(可重复读) | x | x | √ |
serialization(可串行化) | x | x | x |
mysql实际操作
- 初始化语句
CREATE TABLE `test` (
`id` int(11) NOT NULL,
`num` int(11) NOT NULL DEFAULT '0',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci
- mysql8之前版本
SELECT @@tx_isolation;
- mysql8
SELECT @@transaction_isolation;
- 查询结果
mysql的默认事务是REPEATABLE-READ-可重复读
脏读
- 设置隔离级别为读未提交(read uncommitted)
SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
A事务
- 查询数据
SELECT * FROM test;
- 结果
B事务
- 插入数据
START TRANSACTION ;
INSERT test VALUE(1,10);
A事务
- 查询数据
此时就读取到了未提交的数据
B事务
- 回滚事务
ROLLBACK;
A事务
- 查询数据
不可重复读
- 结果
线程不能读取到其他线程尚未提交的数据
可重复读
上图展示了在同一个事务中读取不管B事务是否提交,A事务读取的数据都是一样的。
- 幻读展示
可重复读的隔离级别虽然保证了在同一个事务中,前后读取数据一致,当时在插入时,由于是表级锁因此数据会等待之前的事务提交完成后再执行,因此出现异常。
参考文档