MySQL数据库事务浅析


数据库事务理解

数据库事务是一种本地的刚性事务,特点是必须支持’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事务读取的数据都是一样的。

  • 幻读展示
    可重复读查询结果

可重复读的隔离级别虽然保证了在同一个事务中,前后读取数据一致,当时在插入时,由于是表级锁因此数据会等待之前的事务提交完成后再执行,因此出现异常。

参考文档


  TOC