一、事务

事务最重要的一个特性就是原子性了,原子性又是通过回滚操作来保证的,而回滚则是通过特定的日志来实现的。

二、MySQL事务的基本特性

  • 原子性:事务可以看作是一个或多个SQL语句组成的逻辑单元,逻辑单元中的每个SQL语句都是相互依赖的,而整个逻辑单元就是一个不可分割的整体存在(类似于物理学到的原子,原子就是不可分割的最小单位存在)。
  • 一致性:事务执行之前和事务执行之后能够对应上,不能离谱(约束可以检查数据是否合理,回滚机制也可以支持一致性)。
  • 持久性:我们知道硬盘上的存储的数据都是持久化存储。而MySQL中的事务执行的各种操作都是持久生效的(最终都会存储到硬盘中),事务一旦执行成功,这里所有操作产生的修改都会写到硬盘中去。
  • 隔离性(重点):并发执行事务的时候,隔离性会在执行效率和数据可靠之间做出一个权衡,隔离描述的就是同时执行的事务之间产生的相互影响。隔离性越高并发性就会越低,数据就越可靠,性能就会越低。

在并发性事务执行的过程中,可能会出现以下问题:

  • 脏读(写加锁解决):读到了写事务提交之前的中间数据(即临时数据)
  • 不可重复读(读加锁解决):一个事务之内多次读取到一个数据,发现每次读取的数据都是不一样的。
  • 幻读(解决方法就是串行化,完全放弃并发执行):一个事务之内多次读到的数据的值是相同的,但是每次读取的结果集不同。

三、四种事务的隔离级别

  • read uncommitted(RU):允许读未提交的数据。此时存在脏读、不可重复读、幻读的问题,事务之间隔离性最低,并发程度最高,效率最高且数据的可靠性最低。
  • read committed(RC):只允许读取已提交的数据(相当于给写加锁,解决了脏读的问题),但是还存在不可重复读和幻读的问题。事务间的隔离性提高,并发性降低。数据更可靠与此同时效率降低。
  • repeatable read(默认的隔离级别)(RR):可以重复读取数据(相当于给写操作和读操作都加锁)。事务间的隔离性提高,并发性降低,效率降低,且数据可靠性提高。解决了脏读和不可重复读的问题,但依然存在幻读的问题。
  • serializable:事务彻底地进行串行执行。解决了脏读、不可重复读、幻读这三个问题。此时事务间的隔离性最高,并发性最低(或者说没有并发性),数据最可靠,效率也最低。

以上就是MySQL中四种事务的隔离性级别,当然要根据实际的需求场景来决定具体使用哪一种隔离级别,尽量找到一个效率和可靠性都能够接收的情况。大部分情况下使用默认的MySQL隔离性级别就可以了(repeatable read)。

好了,以上就是本文的全部内容了。讲解了MySQL中事务的相关内容。大家一定要好好掌握这一部分的内容,因为面试中事务这一部分算是数据库中比较高频的内容,尤其是隔离性这里。

嗯,就到这里吧,再见啦友友们!!!
【从删库到跑路 | MySQL总结篇】事务详细介绍-LMLPHP

12-03 05:06