4、事务

厨子大约 3 分钟数据库原创面试题MySQL程序厨

4.事务

4.0 事务的特性

原子性:要做就做完,要么就不做

一致性:修改前后,不会破坏数据的完整性,无论转账成功是否,不会破坏两个人的账户总金额。

持久性:修改完之后,永久有效

隔离性:多个事务并发操作时,互不干扰井水不犯河水。

4.1 隔离级别

读未提交:其他事务未提交即可读

读提交:提交后即可读

可重复读:两次读的值一致

串行化

image-20211012143745523
image-20211012143745523

MySQL 默认的是,可重复读,Oracle 是读提交。

隔离级别越低,事务请求的锁越少或保持锁的时间越短

推荐阅读:https://www.runoob.com/mysql/mysql-transaction.htmlopen in new window

4.2 什么是幻读,脏读,不可重复读?

事务A、B交替执行,事务A被事务B干扰到了,因为事务A读取到事务B未提交的数据,这就是脏读。

在一个事务范围内,两个相同的查询,读取同一条记录,却返回了不同的数据,这就是不可重复读。

事务A查询一个范围的结果集,另一个并发事务B往这个范围中插入/删除了数据,并静悄悄地提交,然后事务A再次查询相同的范围,两次读取得到的结果集不一样了,这就是幻读。

4.3 事务的几种特性是通过什么实现的?

隔离性:隔离性是通过加锁来实现的,

其他三大特性主要是借助,redo log 和 undo log 来实现的。

4.4 MySQL 如何保证一致性的

这个从两个层面来讲,MySQL的一致性,是通过原子性,隔离性,持久性来实现的,也就是说一致性是目的,其他三种都是手段。

4.5 如何保证原子性的

原子性主要是通过undolog来实现的,因为这个日志里面记录的操作的相反操作,比如insert ,则我们可以通过查询回滚日志,来进行撤销操作。这也就让我们可以回滚事务。

1)当你delete一条数据的时候,就需要记录这条数据的信息,回滚的时候,insert这条旧数据 2)当你update一条数据的时候,就需要记录之前的旧值,回滚的时候,根据旧值执行update操作 3)当年insert一条数据的时候,就需要这条记录的主键,回滚的时候,根据主键执行delete操作 undo log记录了这些回滚需要的信息,当事务执行失败或调用了rollback,导致事务需要回滚,便可以利用undo log中的信息将数据回滚到修改之前的样子。

4.6 如何保证持久性的

持久性,则是通过redolog来实现的,主要是使用了WAL技术,用户在执行一个操作的时候,会同时将这个操作的结果写到内存和redolog中。

那为什么不直接写到磁盘上呢?我们如果每次都写到磁盘上则需要,每次都进行随机IO,而我们的redolog是顺序IO可以直接在后面追加,因为内存是易失的,所以我们通过 redolog 来进行过渡。

redolog的大小是固定的,比如四个一组,每个redolog占用 1G内存。