一致性读(Consistent Reads)/快照读
事务利用 MVCC 进行的读取操作称之为一致性读,或者一致性无锁读,也称之为快照读,但是往往读取的是历史版本数据。所有普通的 SELECT 语句(plain SELECT)在 READ COMMITTED、REPEATABLE READ 隔离级别下都算是一致性读。上面的这句话中,普通的 SELECT 语句是指不加锁的 select 语句在非串行化事务隔离级别下。
一致性读并不会对表中的任何记录做加锁操作,其他事务可以自由的对表中的记录做改动。
很明显,采用 MVCC 方式的话,读-写操作彼此并不冲突,性能更高,采用加锁方式的话,读-写操作彼此需要排队执行,影响性能。一般情况下我们当然愿意采用 MVCC 来解决读-写操作并发执行的问题,但是业务在某些情况下,要求必须采用加锁的方式执行。
锁定读(Locking Reads)/LBCC
也称当前读, 读取的是最新版本, 并且对读取的记录加锁, 阻塞其他事务同时改动相同记录,避免出现安全问题。
哪些是当前读呢?select lock in share mode (共享锁)、select for update (排他锁)、update (排他锁)、insert (排他锁)、delete (排他锁)、串行化事务隔离级别都是当前读。
当前读这种实现方式,也可以称之为 LBCC(基于锁的并发控制,Lock-Based Concurrency Control)