发现不少开发同学对mysql的事务了解不够深,其实也见过一些dba同学们,对于acid也是一知半解的…. 哈哈,当然对于我们大多数人来说,只管用就可以了。 但如果想更进一步,那么还是很好必要理解mysql的事务实现原理的。
当初在乐视开发mysql管理系统的时候,还是积累了不少的mysql知识。但后来因为没有好好的沉淀下来,所以造成现在对mysql的半瓶子晃荡。 做这次分享的起因也是 朋友去某公司面试,被面到了mvcc层面的实现…. 对于开发人员来说,这个答不出来是情有可原的。 不管怎么说还是有些感触的, 所以重新回顾了很多的概念,一些难以理解的问题会请教dba朋友… 后期我会整理一份视频,这样大家不用只看这枯燥的pdf文件了…
我会着重的聊这几个题目:
- innodb 基本结构
- innodb acid 概念
- innodb buffer pool
- mvcc
- 各种延伸
- 锁, 各种锁
PDF下载地址:
PPT在线看地址:
http://www.slideshare.net/rfyiamcool/mysql-acid
下面的ppt的简略内容:
1. 分析mysql acid设计实现 blog- xiaorui.cc author- rfyiamcool 2. innodb 基本结构 innodb acid 概念 innodb buffer pool mvcc 各种延伸 锁, 各种锁 List 3. innodb的抽象结构 tablespace leaf node segment no-leaf segment rollback segment … extent … page … row row row row row row trx id rollback ptr field ptr … segment extent page row 4. b+tree 数据结构 15| |56| | 77 15 | |30| | 45 … … 22 row 20 row 17 row 16 row [16, 17, 20, 22] 31 row 35 row 44 row 32 row [31, 32, 35, 44] page 有序数组 5. file system vs disk disk - - - > 512 bytes file system - - -> 4k innodb engine - - - > 16k 6. size不同如何上下对齐? partial page write ? 解决办法是 doublewrite buffer + doublewrite doublewrite 性能影响? 5% - 10% 7. dirty page dirty page double write buffer (2m) double write | double write 数据 文件 redo log crash recovery !!! 8. what is acid atomicity consistency isolation durability 9. atomicity 一个事务为一个原子 不可分割 要么成功 要么失败 10. consistency 经过一系列改动及异常崩溃,最后的结果是我要的. 最终一致性 强一致性 11. isolation mvcc 隔离级别 READ UNCOMMITTED READ COMMITTED REPEATABLE READ SERIALIZABLE 12. durability 一旦提交成功,那么事务涉及的数据都会持久化 即使系统崩溃,修改的数据也不会丢失 13. innodb buffer pool page buffered page buffered page buffered page buffered page buffered page buffered old 37% new 63% 新数据 新数据 新数据 新数据 14. update where blog = ‘xiaorui.cc’ data in buffer pool Load page to buffer pool update data and mark dirty page !!! yes ! no ! 15. innodb buffer pool lru free list dirty page flush list 16. 一些概念总览 redo undo lsn checkpoint purge 17. 一个事务过程 1. begin 2. undo log 3. udate where id = xxx; 4. redo buffer 5. redo fsync; binlog; commit if crash ? if crash ? if crash ? one of three happen crash ? 18. redo when redo save ? when commit ! 顺序io page number + block when redo reduce ? Ringbuffer full flush timer run 19. undo 随机io 是否存入文件, 取决于buffer pool 20. flush log rule innodb_flush_log_at_trx_commit = 1 Log Buffer File System Buffer Lb_log file innodb_flush_log_at_trx_commit = 0 innodb_flush_log_at_trx_commit = 2 write os cache timer flush every 1s 21. mvcc 读读非阻塞 读写非阻塞 写写阻塞 一句话, 并发的效果,串行的结果 !!! 22. 又是概念 read view 隐藏字段 是否可见的条件 当前读 快照读 23. mvcc流程图 trx_id 10 trx_id 15 | row| trx_id | rollback ptr | … read view list trx_id roll ptr data undo data trx_id roll ptr data … undo dataread & write trx_id in read view <= trx_id 24. 幻读 record lock gap lock next gap lock 25. 业务数据不一致 事务 A 事务B ts begin ts select stock where ticket=10 ts begin ts update stock=stock-1 ts commit ts select stock where ticket = 10 ts update stock=stock-1 ts commit stock=1 stock=0 stock=-1 最后 -1 26. 互斥锁 vs 自旋锁 互斥锁 select * from train where ticket = 10 for update; 自旋锁 update train set stock=stock-1 where ticket = 10 and stock = xxx; 27. crash recovery 从doublewrite 修正缺斤少两的page 重做提交的redo日志 回滚执行一半的 未提交的 事务 28. “ Q & A” –fengyun rui
END.