一、事务特性(ACID):
- 原子性(Atomicity):事务是不可分隔的最小操作单元,要么全部成功,要么全部失败,如转账操作要么都完成要么都不完成。
- 一致性(Consistency):事务完成时必须使所有数据保持一致状态,转账时一方扣款另一方必须加款。
- 隔离性(Isolation):数据库系统提供隔离机制,保证事务在不受外部并发操作影响的独立环境下运行。
- 持久性(Durability):事务一旦提交或回滚,对数据的改变是永久的,即落盘操作。
二、并发事务问题及解决:
- 问题:并发事务有脏读(一个事务读到另一个未提交事务的数据)、不可重复读(同一事务先后读取同一条记录数据不同)和幻读(按条件查询无对应数据,插入时却发现数据已存在)三种问题。
- 解决:通过MySQL的四种隔离级别解决,分别是读未提交(不能解决任何问题)、读已提交(解决脏读)、可重复读(解决脏读和不可重复读)、串行化(解决所有问题但效率低),MySQL默认隔离级别是可重复读。
三、Undo log和Redo log区别:
- Redo log:记录事务提交时数据页的物理修改,由内存中的redo log buffer和磁盘中的redo log file组成,用于实现事务的持久性,采用先写日志(WAL)方式提升性能。
- Undo log:记录数据被修改前的信息,是逻辑日志,用于事务回滚和MVCC,保证事务的原子性和一致性。
四、事务隔离性保证:
- 锁:如排他锁,insert、update、delete会自动添加,防止其他事务修改数据。
- MVCC(多版本并发控制):维护数据多个版本,使读写无冲突,依赖隐藏字段(事务ID和回滚指针)、undo log(生成版本链)和readview(快照读依据,定义数据访问规则)实现,不同隔离级别下readview生成方式不同。
已帮你记录好《MySQL相关内容讨论》,详细内容请点击下方查看:
MySQL相关内容讨论
会议讨论了MySQL主从同步原理和分库分表的相关内容,包括其概念、策略和应对问题的方法等,具体如下:
五、主从同步原理:
- 提问时机:面试官问主从同步原理问题的时机,一是面试者之前提过主从,二是简历上说过主从相关内容。
- 应用架构:Java应用先连接数据库中间件,中间件至少连接主库和从库,主库负责写数据,从库负责读数据。
- binlog日志:即二进制文件,记录数据定义语言(DDL,如create、alter、drop)和数据操纵语言(DML,如insert、update、delete)操作,不包含查询操作。
- 同步流程:主库数据变化时将变化数据写入binlog日志;从库的IO THREAD线程从主库binlog日志读取数据并写入从库的中继日志(relay log);从库的SQL Server线程读取中继日志文件并重新执行命令,实现主从数据同步。
- 面试回答:强调binlog日志记录DDL和DML操作,主库将变化数据写入binlog,从库读取并写入中继日志,再从中继日志读取数据写入自身数据库实现同步。
六、分库分表概述:
- 需求背景:主从架构主要解决访问压力和读写分离问题,无法解决海量数据存储问题。当单表数据量达到1000万或单表存储超过20G,或业务数据增多、用户量上升导致出现IO瓶颈和CPU瓶颈时,需要分库分表。
- 主要作用:分库分表可解决存储压力,增加用户连接数。
- 分库分表策略:
- 垂直分库:以表为依据,按业务将不同表拆分到不同库中,如电商数据库按用户、订单、商品业务拆分为三个库。类似微服务架构,每个微服务对应一个数据库。特点是按业务分级管理,可在高并发时提高磁盘IO和数据量连接数。
- 垂直分表:以字段为依据,将不常用字段和大文本、二进制大字段拆分到不同表中,如将商品描述字段从SKU表拆分到附件表。拆分后可实现冷热数据分离,减少IO争抢。
- 水平分库:将一个库的数据拆分到多个库中,各库存储数据不同,所有库数据总和为业务全量数据。查询时可按ID取模或ID范围路由。可解决单库大数据量高并发的性能瓶颈问题,提高系统稳定性和可用性。
- 水平分表:将一个表的数据拆分到多个表中,表可在同一库内。操作时按区域模方式查找、存储、删除。可优化单表数据量过大的性能问题,避免IO争抢,减少锁表几率。
- 分库分表后的问题及解决方法:
- 产生的问题:包括分布式事务问题,可能导致事务不一致;跨节点关联查询和跨节点分页排序问题;主键重复问题。
- 解决方法:使用中间件,如Mycat、ShardingSphere,可降低开发难度,解决上述问题。
- 面试回答建议:
- 介绍业务:根据简历项目介绍业务,说明达到分库分表量级的情况。
- 选择策略:海量数据存储优先选水平分库;水平分表解决单表存储和性能问题,实际开发用得相对少;垂直分库在微服务项目中常用,可提高磁盘IO和网络连接数;垂直分表可分离冷热数据,多表查询互不影响。同时要考虑中间件使用问题。