(1)数据库为什么要有事务?
为了保证数据最终的一致性。
(2)事务包括哪几个特性?
原子性、隔离性、一致性、持久性。
参考:事务的ACID特性:https://zhuanlan.zhihu.com/p/27789602
(3)事务的并发引起了哪些问题?
事务并发会引起脏读、重复读、幻读问题。
(4)怎么解决事务并发出现的问题?
设置事务隔离级别,读未提交,读提交,重复读,序列化。
参考:事务的4种隔离级别:https://zhuanlan.zhihu.com/p/27790194
(5)数据库通过什么方式保证了事务的隔离性?
通过加锁来实现事务的隔离性。
参考:mysql 的各种锁:https://zhuanlan.zhihu.com/p/52312376
(6)频繁的加锁会带来什么问题?
读数据的时候没办法修改。修改数据的时候没办法读取,极大的降低了数据库性能。
(7)数据库是如何解决加锁后的性能问题的?
MVCC 多版本控制实现读取数据不用加锁, 可以让读取数据同时修改。修改数据时同时可读取。
一、什么是MVCC?
MVCC是在并发访问数据库时,通过对数据做多版本管理,避免因为写锁的阻塞而造成读数据的并发阻塞问题。
通俗的讲就是MVCC通过保存数据的历史版本,根据比较版本号来处理数据的是否显示,从而达到读取数据的时候不需要加锁就可以保证事务隔离性的效果
二、Innodb MVCC实现的核心知识点
1、事务版本号
2、表的隐藏列。
3、undo log
4、 read view
2-1、事务版本号
每次事务开启前都会从数据库获得一个自增长的事务ID,可以从事务ID判断事务的执行先后顺序。
2-2、表格的隐藏列
DB_TRX_ID: 记录操作该数据事务的事务ID;
DB_ROLL_PTR:指向上一个版本数据在undo log 里的位置指针;
DB_ROW_ID: 隐藏ID ,当创建表没有合适的索引作为聚集索引时,会用该隐藏ID创建聚集索引;
2-3、Undo log
Undo log 主要用于记录数据被修改之前的日志,在表信息修改之前先会把数据拷贝到undo log 里,当事务进行回滚时可以通过undo log 里的日志进行数据还原。
Undo log 的用途
(1)保证事务进行rollback时的原子性和一致性,当事务进行回滚的时候可以用undo log的数据进行恢复。
(2)用于MVCC快照读的数据,在MVCC多版本控制中,通过读取undo log的历史版本数据可以实现不同事务版本号都拥有自己独立的快照数据版本。
本文详细介绍了数据库事务的ACID特性,事务并发可能引发的问题,以及如何通过设置事务隔离级别来解决这些问题。重点讲解了MVCC(多版本并发控制)的概念,它是如何在不加锁的情况下保证事务隔离性的,并详细阐述了InnoDB中的MVCC实现,包括事务版本号、隐藏列、undo日志和readview等关键概念。MVCC通过保存数据历史版本,避免了读写冲突,提高了数据库性能。
3228

被折叠的 条评论
为什么被折叠?



