Mysql事务隔离是如何实现的?
隔离的实现主要是渎写锁和和mvcc
什么是一致性非锁定读和锁定读?
锁定读,使用到了读写锁
读写锁是最简单直接的的事务隔离建现方式
1,每次读操作都要获取一个共享(读)锁,每次写操作需要获取一个写锁。
2,共享锁之间不会产生互斥,共享锁和写谈之间.以及写锁与写锁之间会产生互斥.3,当产生锁竞争时,需要等待其中一个操作释放锁后,另一个操作才能获取到锁
锁机制,解决的就是多个事务同时更新数据,此时必须要有一个加锁的机制
行锁(记录锁)∶解决的就是多个事务同时更新一行数据
问隙锁:解决的就是多个事务同时更新多行数据
下列操作属于锁定读
select ... lok in share mode
select ... for update
insert.
update.
delete
非锁定读
使用mvcc多版本控制实现
说一下MVCC内部细节
1,Multi-Verslon Concurreny Control多版本并发控制,MVCC是一种并发控制的方法,一般在数据库管理系统中,实现对数据库的并发访同
2,InnoDB是一个多版本的存储引擎。它保存有关已更改行的旧版本的信息,以支持并发和回滚等事务特性。这些信息存储在一个称为回滚段的数据结构中的系统表空间或undo表空间中。参见第14.6.3.4节撤销表空间,InnoDB使用回滚段中的信息来执行事务回滚所需的撤销操作。它还使用这些信息构建行的早期版本。以实现一致的读取
3,MvCC的实现依赖于:隐藏字段、Read View、undo log,
隐藏字段
1,A 6-byte DB_TRX_ID用来标识最近一次对本行记录做修改(insert 、 update)的事务的标识符,即最后一次修改本行记录的事务id,如果是delete操作,在InnoDB存猪引擎内部也属于一次update操作,即更新行中的一个特殊位,将行标识为己删除,并非真正删除.
2,A 7-byte DB_ROLL_PTR 回滚指针,指向该行的undo log。如果该行未被更新,则为空.
3,A 6-byte DB_ROW_ID如果没有没置主键且该表没有唯一非空索引时,Innsos会使用该id来生成聚簇索引.
Read View
不同的事务隔离级别中,当有事物在执行过程中修改了数据(更新版本号),在并发事务时需要判断一下版本链中的哪个版本是当前事务可见的。为的InnoDB有了ReadView的概念,使用ReadView来记录和隔离不同事务并发时此记录的哪些版本是对当前访问事物可见的。
undo log
除了用来回滚数据,还可以读取可见版本的数据。以此实现非锁定读