`Laravel`版`小丑路人社区`改版中,与`Hyperf版小丑路人社区`数据互动,此版本改版中……尚未彻底完结!

Q:

Mysql事务隔离级别与实现原理

Mysql事务

数据库事务指的是一组数据操作,事务内的操作要么就是全部成功,要么就是全部失败。

事务的四大特性(ACID)

  • 原子性(Atomicity)
  • 一致性(Consistency)
  • 隔离性(Isolation)
  • 持久化/持久性(Durability)

事务隔离级别是针对于隔离性的特征而言。

事务隔的概念说明

脏读(UPDATE)(读未提交)

脏读指的是读取了其它事务未提交的数据,意味着数据可被回滚,可能是不存在的数据。读到了不一定最终存在的数据,就是脏读。

不可重复读(UPDATE)(读提交)

对比可重复读,不可重复读是指在同一事务内,不同时刻读取的同一组数据可能是不一样的,可能会收到其他事务的影响,比如其它事务改了此组数据并提交了。通常针对数据更新(UPDATE)操作。

可重复读(UPDATE)

可重复读指的是在一个事务内,最开始读到的数据与事务结束前的任意时刻读取的同一批数据是一致的。通常针对数据更新(UPDATE)操作。

幻读(UPDATE)(可重复读)

幻读是指针对数据插入(Insert)操作来讲。
假如事务A对某些行数据作了变更,但是未提交事务;此时事务B插入了与事务A更改前的记录相同的记录行,并且在事务A提交之前先交了,而此时在事务A内查询,会发现刚刚的更改对于某些数据未起作用,但其实是事务B刚插入的,让用户感觉出现了幻觉,这就称为幻读。

Mysql事务隔离级别

读未提交(read uncommittied) 脏数据

读提交(read committed) 解决了脏读,存在不可重复读

可重复读(repeatable read) 幻读

串行化(serializable)(事务串行执行,避免以上所有问题。)

隔离级别 脏读 不可重复读 幻读
读未提交 可能 可能 可能
读提交 不可能 可能 可能
可重复读 不可能 不可能 可能
串行化 不可能 不可能 不可能

可重复读是 MySQL 的默认级别。

# 查看事务隔离级别 5.7.20 之后
show variables like 'transaction_isolation';
SELECT @@transaction_isolation

# 5.7.20 之后
SELECT @@tx_isolation
show variables like 'tx_isolation'
名称
Variable_name Value
tx_isolation REPEATABLE-READ

设置全局隔离级别

set global transaction isolation level {事务隔离级别:repeatable read}

查询当前有多少事务正在运行

select * from information_schema.innodb_trx

共享锁:其它事务可读不可改

SELECT ... LOCK IN SHARE MODE

排它锁|索引记录加锁

SELECT ... FOR UPDATE

  • record locks(记录锁):在索引记录上加锁
  • gap locks(间隙锁):在索引记录之间加锁,或在第一个索引之前加锁,或在最后一个索引之后加锁
  • next-key locks:在索引记录上加锁,并且在索引记录之前的间隙加锁。它相当于是Record Locks与Gap Locks的一个结合。

读提交解决了脏读问题,行锁解决了并发更新的问题,并且 MySQL 在可重复读级别解决了幻读问题,是通过行锁和间隙锁的组合 Next-Key 锁实现的。

Mysql
订阅

评论记录


评论/回复