【MySQL的发展历程】
MySQL开始由MySQL AB公司开发,2008年1月被Sun公司收购,2009年4月Oracle公司收购Sun公司。
【MySQL的事务简介】
MySQL的事务有四大特性ACID:
原子性(Atomicity)
一个原子事务操作,必须是完整的,全部成功执行,否则全部失败,不存在执行部分的情况。原子型的实现是基于日志的Redo/undo机制。一致性(Consistant)
事务开启后的所有执行结束后,数据库的完整性约束没有被破坏,既数据一致性,例如:A向B转账的一个事务,A的账户减少了100元,B的账户就应该收到100元。隔离性(Isalotion)
数据库允许事务并发运行,隔离性是为了避免并发运行时数据交叉执行而导致数据不一致。持久性(Durable)
事务提交后,事务执行的结果被永久的写入到数据库中。
MySQL事务中可能存在的问题:
脏读:能读取到其他事务未提交的数据,这些数据可能会回滚。例如:当前事务A可以读取到其他事务B的未提交的数据(脏数据)。
不可重复读:同一事务读取同一个数据(已提交的数据),两次读取的结果不一样。
幻读:在事务中按照某个条件进行查询两次,两次查询的结果的条数不同。
事务隔离就是为了解决上述几个问题,事务隔离的级别越高,系统性能开销就越大。
事务隔离级别 | 脏读 | 不可重复读 | 幻读 |
读未提交(Read uncommitted) | 可能 | 可能 | 可能 |
读提交(Read commited) | 不可能 | 可能 | 可能 |
可重复读(Repeatable read) | 不可能 | 不可能 | 可能 |
串行化(serializable) | 不可能 | 不可能 | 不可能 |
# 查询隔离级别
mysql> select @@transaction_isolation; # MySQL5.7.20之前
mysql> select @@tx_isolation; # MySQL5.7.20之前
# 设置隔离级别未read uncommitted
mysql> set global transaction isolation level read uncommitted;
mysql> select @@transaction_isolation;
复制
MySQL中的InnoDB引擎支持MVCC
应对高并发事务,MVCC比单纯的行级锁更有效,性能开销也更低
MVCC在RC和RR级别起作用
MVCC即可以基于乐观锁也可以基于悲观锁实现
当前读
读取最新的数据记录,读取时要保证其他并发事务不能修改当前记录,在读取数据的时候加锁。快照读
快照读的前提是隔离级别不是串行级别,快照读的实现是基于多并发版本控制即MVCC。
并发读读:不存在任何问题,也不需要并发控制; |
并发读写:有线程问题,会引起事务隔离性问题,比如说脏读、不可重复读、幻读; |
并发写写:有线程问题,可能会引起数据更新丢失问题; |
隐式字段:
- DB_ROW_ID 6byte,(隐藏主键),ID自增
- DB_TRX_ID 6byte,事务ID
- DB_ROLL_PTR 7byte,回滚指针,指向这条记录的上一个版本(rollback segment)
undo日志(2种):
- insert undo log
代表事务在insert新纪录时产生undo log,只在事务回滚时需要,并且在事务提交后可以被立即丢弃- update undo log
事务在进行update或者delete时产生undo log;不仅在事务回滚时需要,在快照读取的时候也需要;所以不能随便删除,只有在快速或事务回滚不涉及该日志时,对应的日志才会被purge线程统一清楚;
undo log对于MVCC来说就是存在rollback segment的旧记录链。
Read View:
Read View有3个全局属性:
trx_list: 一个数值列表,用来维护Read View生成时刻系统正活跃的事务ID;
up_limit_id: 记录trx_list列表中事务ID最小的ID;
low_limit_id: Read View生成系统尚未分配的下一个事务ID,即最大事务ID+1;
RC隔离级别:
每次快照读都会生成一个最新的Read View;
开始比较DB_TRX_ID与up_limit_id,如果小于,这当前事务能看到db_trx_id所在的记录;否则进行下一个判断;
比较DB_TRX_ID与low_limit_id,如果大于等于则代表DB_TRX_ID所在的记录在Read View生成以后出现的,对当前事务不可见;
判断DB_TRX_ID是否在活动事务列表之内,trx_list_contains(DB_TRX_ID),如果在,则表示该事务在生成ReadView时刻处于活跃状态,数据未提交,修改的数据当前事务不可见。
RR隔离级别:
MySQL的安全
MySQL数据恢复
问题定位
5、MySQL的问题定位
6、常用的主从复制原理