事物概念
- 事物是一组操作的组合,是不可分割的工作单位,所有操作作为一个整体,要么同时成功,要么同时失败。例如张三给李四转账1000元,张三减1000元与李四加1000元的操作组合就是事物。
事物特性(ACID)
- 原子性(Atomicity):事物是不可分割的最小操作单元,要么全部成功,要么全部失败。如转账中,扣除转账方金额和增加收款方金额的操作必须同时成功或失败。
- 一致性(Consistency):事务完成时,必须使所有数据保持一致状态。在转账过程中,转账前后双方金额总和不变,保证数据的一致性。
- 隔离性(Isolation):数据库系统提供隔离机制,保证事务在不受外部并发操作影响的独立环境下运行。例如,A向B转账时,不能受其他事务干扰。
- 持久性(Durability):事务一旦提交或回滚,对数据的改变是永久的,即落盘操作。转账事务提交后,数据会持久化保存在磁盘中。
主要知识点总结
视频主要知识点总结
- 并发事务问题及解决思路
- 问题引出:面试官常问并发事务带来的问题、解决方法及MySQL默认隔离级别,这些问题相互关联。
- 核心概念:并发事务问题主要包括脏读、不可重复读和幻读,解决问题的关键在于MySQL的隔离级别。
- 关键知识点:理解并发事务问题与隔离级别之间的联系,为后续解答做准备。
- 并发事务问题详解
- 脏读
- 定义:一个事务读到另一个未提交事务修改的数据。
- 举例:事务A查询并修改id为1的数据但未提交,事务B此时查询到A修改后的最新数据,此为脏读。
- 不可重复读
- 定义:一个事务先后两次读取同一条记录结果不同。
- 举例:事务A先查询id为1的数据,事务B修改并提交该数据后,事务A再次查询得到B提交后的数据,两次结果不同即为不可重复读。
- 幻读
- 定义:一个事务按条件查询无数据,但插入时发现该行已存在(前提是已解决不可重复读问题)。
- 举例:事务A先查询id为1的数据无结果,事务B插入id为1的数据并提交后,事务A再次查询仍无结果,但插入时提示数据已存在,此为幻读。
- 脏读
- MySQL隔离级别介绍
- 隔离级别分类
- 读未提交(read uncommitted):不能解决脏读、不可重复读和幻读问题,开发中一般不用。
- 读已提交(read committed):可解决脏读,不能解决不可重复读和幻读。
- 可重复读(repeatable read):MySQL默认隔离级别,能解决脏读和不可重复读,不能解决幻读,是性能和安全的平衡选择。
- 串行化(serializable):可解决所有问题,但效率极低,几乎放弃并发事务,实际开发中一般不用。
- 隔离级别与性能安全关系:隔离级别越低安全性越高但性能越差,通常使用可重复读作为平衡选择。
4. 面试题回答
- 并发事务问题及解决方法回答
- 问题阐述:并发事务存在脏读、不可重复读和幻读问题。
- 解决方法:通过MySQL的四种隔离级别解决,各隔离级别解决问题情况如上述。
- MySQL默认隔离级别回答:MySQL默认隔离级别为可重复读(repeatable read)。
MySQL中undo log和redo log的区别
2. redo log相关内容
- 概念引入
- MySQL中有缓冲池(buffer pool)和数据页(page)概念。数据页是存储磁盘管理最小单元,大小为16kb,存储表中一行数据,某表数据可能由多个数据页组成。
- 操作数据(如update、delete)时,为提升性能先操作内存中的缓冲池,若缓冲池无所需数据则从磁盘加载数据页到缓冲池,操作完成后按一定频率同步到磁盘,可减少磁盘I/O提升处理速度。
- redo log作用机制
- 问题:操作完的数据在内存中形成脏页,若服务器宕机同步失败,数据丢失违背事务持久性。
- 解决:引入redo log,它由redo log buffer(内存)和redo log file(磁盘)组成,记录事务提交时数据页物理修改,实现事务持久性。增删改操作时,buffer pool变化同时,redo log buffer记录数据页变化并同步到redo log file,若脏页同步失败可从redo log恢复数据。
- 优势:若不使用redo log直接同步数据,多记录操作时是随机磁盘I/O性能低,而redo log是顺序磁盘I/O性能高(WAL机制:先写日志)。脏页正常同步后,redo log会定期清理,且在磁盘有两份循环写。
3. undo log相关内容
- 定义与作用
- undo log是回滚日志,记录数据被修改前信息,作用为提供回滚和MVCC,此处重点为回滚。例如删除数据记录对应insert记录,修改数据记录相反修改记录,事务回滚时可据此恢复数据,从而实现事务的一致性和原子性。
4. redo log和undo log的区别总结
- redo log记录数据页物理变化,服务宕机时用于数据同步,保证事务持久性;
- undo log记录逻辑日志,事务回滚时通过逆操作恢复原来数据,保证事务原子性和一致性。
事务隔离性实现方式
- 隔离性由锁和MVCC保证
- 锁:如排他锁,insert、update、delete操作会自动添加,防止其他事务修改数据。
- MVCC(多版本并发控制):维护数据多个版本,使读写无冲突,是重点讲解内容。
MVCC原理
- MVCC定义与功能:全称multi version concurrent control,在多事务并发时确定访问版本,不同隔离级别访问结果不同。
- MVCC实现依赖
- 隐藏字段:MySQL表有隐藏字段
- 隐藏字段:MySQL表有隐藏字段
- **undo log(回滚日志)**:insert操作产生的日志在事务提交后删除,update和delete操作产生的日志在MVCC版本访问时也需用到,不会立即删除,其版本链记录不同事务对同一条记录的修改,形成链表,头部是最新旧记录,尾部是最早旧记录。
- **read view(读视图)**:快照读sql执行时MVCC提取数据的依据,记录并维护当前活跃事务id(未提交事务)
MVCC在不同隔离级别下的应用
- RC级别:以事务五查询为例,第一次查询时根据读视图规则和版本链,结合活跃事务id(3、4、5)等信息,确定能访问事务二提交后的数据;事务三提交后第二次查询,根据新的活跃事务id(4、5)等,能访问事务三的数据。
- RR级别:事务五第一条查询语句生成的读视图与RC级别第一次查询时相同(活跃事务id为3、4、5等),后续查询复用此读视图,根据规则和版本链,能访问事务二的数据。
面试题回答总结
面试官询问事务隔离性如何实现时,应提及MVCC和锁,重点解释MVCC包括其定义(维护数据多版本使读写无冲突)、实现依赖的隐藏字段(db_tst记录事务id,db_roll_pointer指向记录上一版本)、undo log(回滚日志及版本链)、read view(解决事务查询选择版本问题,不同隔离级别生成读视图方式不同)。