2.MySql的事务隔离级别有哪几种?
- 隔离级别用于表述并发事务之间的相互干扰程度,其基于锁机制进行并发控制。
- 可序列化(Serializable):事务一个接一个的执行,完全相互独立;实现可序列化要求在选定对象上的读锁和写锁保持直到事务结束后才能释放;在SELECT的查询中使用一个WHERE子句来描述一个范围时应该获得一个“范围锁”。
- 可重复度(Repeatable Read):事务A读取数据之后,对涉及的数据加锁,不允许其他事务进行修改,由于其他事务会插入新的数据,因此会产生幻读;对选定对象的读锁和写锁一直保持到事务结束,但不要求“范围锁”,因此可能会发生幻读;可重复读是MySQL的默认事务隔离级别。
- 读取已提交(Read Committed):只能看到其他事务已经提交的数据,避免了脏读,但存在不可重复读、幻读;DBMS需要对选定对象的写锁(write locks)一直保持到事务结束,但是读锁(read locks)在SELECT操作完成后马上释放,且不要求“范围锁”。
- 读取未提交(Read Uncommitted):可以看到其他事务没有提交的数据,出现脏读、不可重复读、幻读;
[PS补充]
不可重复读的重点是修改:同样的条件,读取过的数据,再次读取出来发现值不一样了。
幻读的重点在于新增或者删除:同样的条件,第1次和第2次读出来的记录数不一样。
3.MySql的MVVC有什么作用?
- 多版本并发控制(MVCC),来实现MySQL上的多事务并发访问时,隔离级别控制;
- 数据版本:并发事务执行时,同一行数据有多个版本;
- 事务版本:每个事务都有一个事务版本;
- 版本有序:版本是通过时间来标识的;
- 通过MVCC实现的效果是同一时刻、同一张表、多个并发事务,看到的数据是不同的。
- MVCC本质使用了copy-on-write,为每个数据保留多份snapshot,不同snapshot之间,使用指针连接成链表;update操作,能看到的snapshot是受限的,是链表上小于等于当前事务版本的最大版本(读取已提交:离当前事务最近的已提交版本);