MySQL面试之事务详解

事务是什么?

事务是一系列的数据库操作,是数据库应用的基本单位。MySQL 事务主要用于处理操作量大,复杂度高的数据。其主要有下事务特性、脏读、幻读、不可重复读、事务隔离、并发事务以及事务实现原理。
在这里插入图片描述

MySQL中只有InoDB引擎支持事物,具有四个特性如下:

  • 原子性(Atomic):要么全部执行,要么全部不执行。
  • 一致性(Consistency):事物执行使得数据库从一种正确状态转化为另一种正确状态。
  • 隔离性(Isolation):在事物正确提交前,不允许把事物对数据的任何改变提供给其他事物。(加锁)
  • 持久性(Durability):事物提交后,其结果永久保存在数据库中。

什么是脏读?

在事物A修改数据之后提交数据之前,事物B来读取数据,如果不加控制,事物B读取A修改过数据,之后A又对数据作了修改再提交,则B读到的数据是脏数据,此过程称为脏读Dirty Read。

什么是幻读?

幻读的重点在于新增或者删除:在同一事物中,同样的条件,第一次和第二次读出来的记录数不一样。

不可重复读?

其重点在于修改,同一事物中,同样的条件,第一次读的数据和第二次读的数据不一样。(因为中间有其他事物提交了修改)

MySQL中有几种事物隔离级别?

MySQL中有四种四种事物隔离级别:

  • read uncommited:未提交读,读到未提交数据;
  • read commited:读已提交,也叫不可重复读,两次读到的数据不一致;
  • repetable read:可重复读
  • serializable:串行化,读写数据都会锁住整张表,数据操作不会出错,当并发现能极低,开发中很少用到。
    同时默认使用REPEATABLE-READ 的事物隔离级别。

隔离级别与脏读、幻读、不可重复读的关系?

隔离级别脏读不可重复读幻读
Read UncommitedYESYESYES
Read commitedNOYESYES
Repeatable ReadNONOYES
SerializableNONONO

并发事物有什么问题?应该如何解决?

并发事物可能造成:脏读,不可重复读和幻读等问题。由数据库提供一定的事物隔离机制解决。

  • 加锁:读取数据前,对其加锁,阻止其他事物对数据进行修改。(serializable隔离)
  • 提供数据多版本并发控制(MultiVersion Concurrency Control),简称MVCC(多版本数据库):不用加任何锁,通过一定机制生成一个数据请求时间点的一致性数据快照(Snapshot),并用这个快照来提供一定级别的一致性读取,从用户的角度来看,好像是数据库提供同一数据的多个版本。

MVCC

  • 支持MVCC的数据库在更新某些数据时,并非使用新数据覆盖旧数据,而是标记旧数据是过时的,同时在其他地方新增一个数据版本。因此,同一份数据有多个版本存储,但只有一个是最新的。

  • 提供了时间一致性的处理事物,MVCC读事物时,通常使用一个时间戳或者事物ID来缺确定访问那个状态的数据库哪些版本的数据库。读事物和写事物是分开的。假设同一份数据,击有读事物访问,又有写事物操作,实际上,写事物会新建一个新的数据版本,读事物则访问的是旧的数据版本,直到写事物提交,读事物才能访问新版数据。

  • MVCC有两种实现方式,第一种实现方式是将数据记录的多个版本保存在数据库中,当这些数据版本不再需要时,用垃圾收集回收这些记录(PostgreSQL/Firebird/Interbase采用)。第二种实现方式只在数据库保存最新版本的数据,但是会使用undo log时动态重构旧版本数据。(Oracle/MySQL/InnoDB使用)

  • InnoDB的MVCC,通过在每行记录后面保存两个隐藏的列来实现:一个保存了行的创建时间,一个保存行的过期时间(删除时间,redis中的过期时间),这是类似于系统版本好

  • select操作。
    InnoDB只查找版本早于(包含等于)当前事务版本的数据行。可以确保事务读取的行,要么是事务开始前就已存在,或者事务自身插入或修改的记录。
    行的删除版本要么未定义,要么大于当前事务版本号。可以确保事务读取的行,在事务开始之前未删除。

  • insert操作。将新插入的行保存当前版本号为行版本号。

  • delete操作。将删除的行保存当前版本号为删除标识。

  • update操作。变为insert和delete操作的组合,insert的行保存当前版本号为行版本号,delete则保存当前版本号到原来的行作为删除标识。

MySQL事务实现原理是?

事务的实现是基于数据库的存储引擎,不同的存储引擎对事务的支持程度不一样。MySQL中事务的存储引擎有InnoDB和NDB。InnoDB是高版本MySQL的默认的存储引擎,因此就以InnoDB的事务实现为例,InnoDB是通过多版本控制并发(MVCC)解决不可重复读问题,加上间隙锁(也就是并发控制)解决幻读问题。因此InnoDB的RR隔离级别其实实现了串行化级别得到效果,而且保留了比较好的并发性能。

begin开启事务,rollback回滚事务,commit提交事务。

begin;
insert person(uname,age) values('****',18);
rollback;
commit;
©️2020 CSDN 皮肤主题: 深蓝海洋 设计师:CSDN官方博客 返回首页