miller
发布于

mysql事务隔离 + 事务4个特性ACID

MySQL 的事务隔离级别一共有四个,分别是读未提交、读已提交、可重复读以及可串行化。

  • 读未提交 xxx
  • 读已提交(READ COMMITTED)

    在读已提交隔离级别下,事务 B 只能在事务 A 修改过并且已提交后才能读取到事务 B 修改的数据。

读已提交隔离级别解决了脏读的问题,但可能发生不可重复读和幻读问题,一般很少使用此隔离级别。

  • 可重复读(REPEATABLE READ)

    在可重复读隔离级别下,事务 B 只能在事务 A 修改过数据并提交后,自己也提交事务后,才能读取到事务 B 修改的数据。

可重复读隔离级别解决了脏读和不可重复读的问题,但可能发生幻读问题。

  • 串行化
    各种问题(脏读、不可重复读、幻读)都不会发生,通过加锁实现(读锁和写锁)。

查看当前隔离级别
show variables like 'transaction_isolation';
select @@transaction_isolation;

事务的四个特性 ACID

  • 原子性(Atomicity):
    指事务是一个不可分割的最小工作单位,事务中的操作只有都发生和都不发生两种情况。

  • 一致性(Consistency):
    事务必须使数据库从一个一致状态变换到另外一个一致状态,举个例子,李二给王五转账 50 元,其事务就是让李二账户上减去 50 元,王五账户上加上 50 元;一致性是指其他事务看到的情况是要么李二还没有给王五转账的状态,要么王五已经成功接收到李二的 50 元转账。而对于李二少了 50 元,王五还没加上 50 元这个中间状态是不可见的。

  • 隔离性(Isolation):
    一个事务的执行不能被其他事务干扰,即一个事务内部的操作及使用的数据对并发的其他事务是隔离的,并发执行的各个事务之间不能互相干扰。

  • 持久性(Durability):
    一个事务一旦提交成功,它对数据库中数据的改变将是永久性的,接下来的其他操作或故障不应对其有任何影响。

其中 RR 实现可重复读的原理是:MVC 多版本并发控制。其实就是版本号概念。读取数据时大于当前事务版本号的记录不管。

同时 RR 中会使用到间隙锁。间隙锁是采用在指定记录的前面和后面以及中间的间隙上加间隙锁的方式避免数据被插入,从而解决幻读的问题。
RC 无间隙锁

浏览 (495)
点赞
收藏
评论