1 事务隔离级别
读未提交(脏读,不可重复读,幻读)
读已提交(不可重复读,幻读)
可重复读(幻读)–>但在mysql5.6版本之后,由于mysql的具有的间隙锁,解决了幻读问题
串行化(安全级别高),效率低,涉及加锁解锁操作。
所以引入MVCC,不使用锁来实现大并发操作。
2 MVCC
MVCC即多版本并发控制,基本思想是在读已提交和可重复读这两个隔离级别下,为每次事务生成一个新版本的数据,随后在使用语句读数据时选择不同的版本的数据即可以实现对结果完整性的读取。可以提高并发的读写性能。
readview
两者的区别主要是readview生成的时机不同。在读已提交中,每次使用select语句都会生成新的readview;在可重复读中,使用的都是第一次进行select语句操作后生成的
版本查找的时候会读取一致性视图readview:格式是
[未提交的事务id数组]+已创建的最大事务id,并根据readview从undo log日志在最新的记录按照以下规则依次向下找。
1、在数据库存储中,数据的存储是在页中按行进行的,每行具有三个隐藏项,row_id(创建索引),trx_id(事务id),roll_ptr(回滚指针)
2、每次更新操作(update,delete)的时候后会生成一条undo log日志,回滚指针指向前一条记录。
规则:
如果当前记录:事务id<未提交事务的最小id,则可读
当前事务id在未提交的事务id数组中,则不可读,继续向下找
当前事务id>已提交的最大事务id,则不可读
未提交的事务id数组中的最小版本 <当前事务id<=已提交的最大事务id,且当前事务id不在提交的事务id数组,则说明事务已提交,可读。
以下是在读已提交的隔离级别下操作:
undo_log:(版本链)