1、MySQL事务理解
mysql事务的四大特性(ACID)
原子性、一致性(事务回滚,数据还原,库存增减数量保持一致)、隔离性、持久性
在mysql开启事务对数据库进行操作时(innodb)
当mysql在执行事务时,会有一个双写机制,使用innodb写入数据时会先将数据写入redo.log(redo.log是会从内存刷盘到磁盘上的),再写入数据页,它可以确保数据库崩盘时,可以使用redo.log将数据恢复保证数据的不会丢失即保证了它的持久性。
事务执行时数据变更前会记录undo.log()到内存中同时刷盘到磁盘上(记录的insert,update,delete的反向操作。如果事务需要回滚则通过undo.log将数据恢复到之前的状态),也就保证了它的原子性和一致性。
事务前后必须满足所有的约束条件,规则和触发器等以保证它的一致性。
事务并发是可能会出现的问题:
脏读:一个事务读取到另一个事务尚未提交的数据
不可重复读:在一个事务中两次读取同一条数据不一致,比如期间另一个事务修改了数据,当前事务读取到了最新值。
幻读:幻读则是指在同一事务中,由于其他事务的插入或删除,导致查询结果集发生变化(即增加或减少了记录)
当多个事务同时执行的时候,可能会出现线程安全问题,在并发读写时可能会有脏读,不可重复读,幻读,通过读已提交,可重复读,串行化这些隔离级别是解决对应的问题,其中串行化依赖于表锁、行锁等。读已提交、可重复读依赖于mvcc机制,主要是通过它的快照来实现的,mvcc会生成最新的一致性快照,解决同一个事务在多次读取相同数据是数据不会发生变化,通过行锁和间隙锁可以避免幻读的问题,解决了隔离性。
注:什么情况下行锁会升级为表锁,锁冲突时,如多个事务在获取某一行的锁是该行的锁已经被一个事务所持有,导致其它事务一直在等待,为避免其它事务在这一行上继续等待就会将行锁升级为表锁。
2、MySQL结构组成
连接层:
负责与客户端进行连接管理,主要功能有身份认证、权限管理、连接控制等,一般会用连接池提高效率,将连接缓存提高复用率。
sql层:
主要由解析器、缓存和优化器等组成,解析器主要对sql进行语法校验和分析,检查sql语句是否合规。如果查询开启了缓存且命中则直接返回结果否则进入优化器进行查询优化(选择合适的索引,合适的执行计划以及表的连接顺序等),基于成本选择最优的执行顺序,最终生成执行计划。交给执行器执行。
引擎层:
sql主要采用接口和引擎层进行交互,不会直接与存储引擎进行耦合而是通过接口来调用不同的存储引擎的接口。
引擎主要有:innodb,myisam,memory等
innodb支持事务,行锁,外键,支持mvcc机制适合高并发,事务性强的场景
myisam是一个轻量级的引擎,支持表锁适合读多写少的场景
事务管理器:
提供acid属性的支持,它主要是由锁、mvcc和事务日志来实现的
存储层:
负责数据的存储和管理,包括日志文件,数据文件等直接存储在磁盘中