MySQL-事务

17.事务的ACID特性是什么?

ACID指的就是原子性一致性隔离性持久性

  1. 原子性就是事务中的操作要不全做,要么全不做。
  2. 一致性就是事务的执行结果必须从一个一致性状态变到另一个一致性状态,不能存在中间状态。
  3. 隔离性就是一个事务的执行不能被其它事务干扰。
  4. 持久性就是事务提交后要保存在磁盘,避免丢失数据。

18.并发事务带来哪些问题?

并发事务可能带来三个问题,分别是脏读不可重复读幻读

  1. 脏读就是事务1先修改数据,在未提交的时候,事务2读取到了修改的数据,如果此时事务1发生了回滚,那么事务2就读到了脏数据。可以通过设置隔离级别为读已提交,来解决脏读的问题。
  2. 不可重复读就是一个事务前后两次读到的结果不一样,可以通过设置隔离级别为重复读来解决这个问题。
  3. 幻读和不可重复读是类似的,但是幻读针对的是整张数据库表,前后两次读取的数据不一致。可以通过设计隔离级别为串行化,来解决幻读的问题。可重复读默认采用临键锁,也可以解决幻读的问题。

临键锁是记录锁和间隙锁的集合,记录锁只能锁定一行数据,也就是记录本身。间隙锁锁定一个范围,不包含记录本身,可以避免插入新数据。那么临键锁就是锁定一个范围,包括记录本身,这样就可以解决幻读的问题。

19.你了解MVCC吗?

MVCC是多版本并发控制,它是读已提交可重复读隔离级别的底层实现。MVCC主要由三个核心部分,分别是隐藏列undologReadView。隐藏列主要用到当前版本的事务ID回滚指针,undolog保存的是历史版本的数据,通过回滚指针连接起来。ReadView就是快照信息,里面主要记录了当前事务ID未提交事务的最小ID未开始事务的ID。在读已提交的事务隔离级别中,每次查询都会生成一个ReadView。而在读已提交的隔离级别中,相同的查询只会生成一个ReadView。在使用MVCC时,主要通过四个判断条件来判断是否可以读取到数据。

  1. 第一个判断条件就是当前版本的事务ID是否等于ReadView中的当前事务ID,如果相等,说明这个版本数据保存在当前事务中,可以读取到。
  2. 第二个判断条件就是当前版本的事务ID是否小于未提交事务的最小ID,如果小于,说明当前版本的数据在事务开始之前保存的,可以读取到。
  3. 第三个判断条件就是当前版本的事务ID是否大于未开始的事务ID,如果大于,说明当前版本的数据在事务开始之后保存的,不能读取到。
  4. 第四个判断条件就是当前版本的事务ID是否大于未开始的最小事务ID且小于未开始事务ID,如果是,说明当前版本的数据在未提交的事务中,不能读取。
  5. 如果这四个条件都不满足,就通过回滚指针找到历史版本数据,再次判断。

20.并发事务的控制方式有哪些?

并发控制方式主要有两种MVCC,MVCC是多版本并发控制,存储多个版本的数据。锁根据粒度不同分为行锁和表锁,行锁就是对一行或多行数据加锁,表锁就是对整张数据库表加锁。

你可能感兴趣的:(MySQL,mysql,数据库)