总结mysql

什么是MVCC?
多版本并发控制:读取数据是通过一种类似于快照的方式将数据保存下来,这样读锁和写锁就不冲突了,不同的事物session会看到自己特定的版本数据,,版本链

MVCC只在READCOMMITTED和Repeatable read两个隔离级别下工作,其它两个隔离级别和mvcc不兼容,因为读未提交总是读取最新的数据行,而不是符合当前事物版本的行数据,而SERIALIZABLE则会对所有的读取的行都加锁

聚簇索引记录中有两个必要的隐藏列:
trx_id:用来存储每次对某条聚簇索引记录进行修改时候的事物id

roll_pointer:每次对哪条聚簇索引记录有修改的是,都会吧老版本写入undo日志中。这个roll_pointer就是存储了一个指针,它指向这条聚聚索引记录的上一个版本的位置,通过它来获取上移版本记录信息(插入操作的undo日志没有这个属性,因为他没有老版本)

读已提交和可重复读的区别就在于他们生成readview的策略不同

事务开始时创建readview,readview维护当前活动的事物id,既未提交的事物id,排序生成一个数组方位数据,获取数据中的事物id(获取的是事务id最大的记录),对比readView:如果在readview的左边(比readview都小),可以访问(在最左边以为这改事务已经提交),如果在readview右边(比readview都大),或者就在readview中,不可以访问,获取roll_pointer,取上一个版本重新对比,在右边意味着,改事务在readview生成之后出现,在readview中意味着还未提交。

读已提交隔离级别下的事物在每次查询的开始都会生成一个独立的readview,而可重复读隔离级别在在第一次读的时候生成一个readview,之后的都读复用之前的readview

这就是msql的mvcc,通过版本链,实现多版本,可并发读写,亵渎,通过readview生成策略的不同实现不同的隔离级别

默认采用可重复读,幻读主要针对的是insert
不可重复读主要针对修改

脏读:在事物进行过程中,读到了其他事物未提交的数据

不可重复读:在一个事物过程中,多次查询的结果不易

幻读:在一个事物过程中,用同样的操作查询数据,得到的记录数不同

处理的方式用很多:加锁,事物隔离、mvcc

b树和b+树的区别:
b树的特点:
1.节点排序
2,一个节点可以存放多个元素,多个元素也可以排序

b+树的特点:
1,拥有b树的特点
2.叶子节点之间有指针
3.非叶子节点上的元素在叶子节点上都冗余了,也就是叶子节点中存储了所有的元素,并且排好顺序

mysql索引使用的是b+树,因为索引是用来加快查询的,而b+树通过对数据进行排序,所以是可以提高查询速度的,然后通过一个节点中可以存储多个元素,从而可以使得b+树的高度不会太高,在mysql中一个innodb页就是一个b+树节点,一个innodb页默认16kb,所以一般情况下一两层的b+树可以存储2000万行的数据,然后通过利用b+树叶子节点存储了所有数据并进行了排序,并且叶子节点之间有指针,可以很好的支持全表扫描,范围查找等sql语句。

并发编程的三要素:

你可能感兴趣的:(Mysql,mysql,java,数据库)