4、事务
4.事务
4.0 事务的特性
原子性:要做就做完,要么就不做
一致性:修改前后,不会破坏数据的完整性,无论转账成功是否,不会破坏两个人的账户总金额。
持久性:修改完之后,永久有效
隔离性:多个事务并发操作时,互不干扰井水不犯河水。
4.1 隔离级别
读未提交:其他事务未提交即可读
读提交:提交后即可读
可重复读:两次读的值一致
串行化

MySQL 默认的是,可重复读,Oracle 是读提交。
隔离级别越低,事务请求的锁越少或保持锁的时间越短
推荐阅读:https://www.runoob.com/mysql/mysql-transaction.html
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内存。
