面试必问之事务的隔离级别与MVCC
大家好,我是热心的大肚皮,皮哥。
事务的隔离级别
可串型化执行
事务并发执行遇到的一致性问题
脏写:指一个事务修改了另一个未提交事务的数据。
脏读:指一个事务读取了另一个未提交事务修改的数据。
不可重复读:指一个事务修改了另一个未提交事务读取的数据。
幻读:一个事务根据条件搜索出部分数据,但在未提交时,另一个事务写入了一些符合条件的数据。
SQL标准中的4种隔离级别
READ UNCOMMITTED:未提交读。可能发生脏读、不可重复读、幻读。
READ COMMITTED:已提交读。可能发生不可重复读、幻读,不会发生脏读。
REPATABLE READ:可重复读。仅可能发生幻读。
SERIALIZABLE:可串行化。均不会发生。
MVCC-多版本并发控制
版本链
insert into hero values(1,'刘备', '蜀');
update hero set name='关羽' where number =1;
update hero set name='张飞' where number =1;
update hero set name='赵云' where number =1;
update hero set name='马超' where number =1;
ReadView
m_ids:生成ReadView时,当前系统中活跃的读写事务id列表。
min_trx_id:在生成ReadView时,当前系统中活跃读写事务中最小的事务id,也是m_ids 的最小值。
max_trx_id:生成ReadView时,系统应该分配下一个事务的事务id。
creator_trx_id:生成ReadView的事务id。
ReadView的使用
如果被访问版本的trx_id与ReadView中的creator_trx_id相同,则代表当前事务在访问自己修改过的记录,可以访问。
如果被访问版本的trx_id小于ReadView中的min_trx_id,则代表生成该版本的事务在生成ReadView之前提交,可以访问。
如果被访问版本的trx_id大于ReadView中的max_trx_id,则代表生成该版本的事务在生成ReadView之后,不可以访问。
如果被访问版本的trx_id在ReadView中的min_trx_id与max_trx_id之间,则需要判断是否在m_ids中,如果在,代表trx_id这个事务属于活跃中,则不可访问;否则代表已经提交,可以访问。
READ UNCOMMITTED(未提交读):直接访问最新版本即可。
READ COMMITTED(已提交读):每次读取数据前都生成一个ReadView。比如,现在系统中有两个事务正在执行,分别是100、200。
# Transaction 100
BEGIN;
update hero set name='关羽' where number =1;
update hero set name='张飞' where number =1;
# Transaction 200
BEGIN;
#修改了一些别的表记录
BEGIN;
#select1: transaction 100、200未提交
select * from hero where number=1;#得到的列name为'刘备'
REPATABLE READ(可重复读):第一次读取时生成ReadView。过程如上。
SERIALIZABLE:这个不过多介绍。
二级索引与MVCC
有收获的劳烦点个在看,然后帮转,感谢↓↓↓