MySQL事务
问题:事务是什么?ACID问题
事务是一组操作的集合,它是一个不可分割的工作单位,事务会把所有的操作作为一个整体一起向系统提交或撤销操作请求,即这些操作要么同时成功,要么同时失败。
1、事务的特性
问题:ACID是什么?
- 原子性(Atomicity):事务是不可分割的最小操作单元,要么全部成功,要么全部失败。
- 一致性(Consistency):事务完成时,必须使所有的数据都保持一致状态。
- 隔离性(lsolation):数据库系统提供的隔离机制,保证事务在不受外部并发操作影响的独立环境下运行。
- 持久性(Durabiity):事务一旦提交或回滚,它对数据库中的数据的改变就是永久的。
经典转账案例:A向B转账500,转账成功,A扣除500元,B增加500元,原子操作体现在要么都成功,要么都失败在转账的过程中,数据要一致,A扣除了500,B必须增加500在转账的过程中,隔离性体现在A像B转账,不能受其他事务于扰,在转账的过程中,持久性体现在事务提交后,要把数据持久化。
2、并发事务会有哪些问题?怎么解决?
并发事务可能出现的问题有:脏读、不可重复读、幻读。
脏读:
不可重复读:
幻读:
解决:脏读、不可重复读、幻读等问题。
对事务进行隔离。如下:
3、MySQL默认隔离级别是?
隔离级别:
- 读未提交(Read uncommitted):不能解决脏读、不可重复读、幻读等问题
- 读已提交(Read committed):能解决脏读,不能解决不可重复读、幻读等问题
- 可重复读(Repeatable Read):默认,能解决脏读、不可重复读。不能解决幻读等问题
- 串行化(Serializable):脏读、不可重复读、幻读都能解决。
注意:事务隔离级别越高,数据越安全,但是性能越低。从上往下【性能高到低】
4、undo log与redo log的区别
- redo log:记录的是数据页的物理变化,服务宕机可用来同步数据
- undo log:记录的是逻辑日志,当事务回滚时,通过逆操作恢复原来的数据
- redo log:保证了事务的持久性,undolog保证了事务的原子性和一致性
MySQL其他问题
5、解释一下MVCC
问题:事务中的隔离性是如何保证的呢?
MySQL中的多版本并发控制。指维护一个数据的多个版本,使得读写操作没有冲突
- 隐藏字段:
- trx_id(事务id),记录每一次操作的事务id,是自增的
- roll_pointer(回滚指针),指向上一个版本的事务版本记录地址
- undo log
- 回滚日志,存储老版本数据
- 版本链:多个事务并行操作某一行记录,记录不同事务修改数据的版本,通过roll_pointer指针形成一个链表
- readView
- 解决的是一个事务查询选择版本的问题
- 根据readView的匹配规则和当前的一些事务id判断该访问那个版本的数据
- 不同的隔离级别快照读是不一样的,最终的访问的结果不一样
- RC:每一次执行快照读时生成ReadView
- RR:仅在事务中第一次执行快照读时生成ReadView,后续复用
6、MySQL主从同步原理
MySQL主从复制的核心就是二进制日志(BINLOG)记录了所有的 DDL(数据定义语言)语句和 DML(数据操纵语言)语句,但不包括数据查询(SELECT、SHOW)语句。
复制(同步)分成三步:
1.Master 主库在事务提交时,会把数据变更记录在二进制日志文件 Binlog 中。
2.从库读取主库的二进制日志文件 Binlog ,写入到从库的中继日志 Relay Log
3.slave重做中继日志中的事件,将改变反映它自己的数据。
7、MySQL分库分表
首先,什么情况下需要分库分表?
分库分表前提
- 前提:项目业务数据逐渐增多,或业务发展比较迅速 单表的数据量达1000W或20G以后
- 优化已解决不了性能问题(主从读写分离、查询索引...)
- IO瓶颈(磁盘IO、网络IO)、CPU瓶颈(聚合查询、连接数太多)
分库分表拆分策略
1、垂直分库
垂直分库:以表为依据,根据业务将不同表拆分到不同库中
特点:
- 按业务对数据分级管理、维护、监控、扩展
- 在高并发下,提高磁盘IO和数据量连接数
2、垂直分表
垂直分表:以字段为依据,根据字段属性将不同字段拆分到不同表中。
拆分规则:
- 把不常用的字段单独放在一张表
- 把text,blob等大字段拆分出来放在附表中
特点:
- 冷热数据分离
- 减少IO过渡争抢,两表互不影响
3、水平分库
水平分库:将一个库的数据拆分到多个库中。所有库的数据加起来才是完整数据。
路由规则
- 根据id节点取模
- 按id也就是范围路由,节点1(1-100万)节点2(100万-200万)
特点:
- 解决了单库大数量,高并发的性能瓶颈问题
- 提高了系统的稳定性和可用性
4、水平分表
水平分表:将一个表的数据拆分到多个表中(可以在同一个库内)。
路由规则
- 根据id节点取模
- 表名不同,可以单独用一张表当作逻辑表存分表的逻辑
特点:
- 优化单一表数据量过大而产生的性能问题
- 避免IO争抢并减少锁表的几率
8、分库分表之后产生的新问题
- 分布式事务一致性问题
- 跨节点关联查询
- 跨节点分页、排序函数
- 主键避重
使用新的技术解决,分库分表中间件:
- sharding-sphere
- mycat