十一、RR和RC的本质区别
select * from 表名 (lock in share mode)
#当不加共享锁时,说明此时进行的是快照读,加了共享锁则进行的是当前读;
当进行快照读的时候才会形成read view结构;
read view形成的时机不同,会影响事务的可见性,会造成RR和RC级别下事务可见性的不同;当RR级别下,某个事务对某条记录进行快照读时会创建一个read view结构,会将当前活跃的其他事务进行记录;此后使用的都是这一个read view,即使之后进行了修改也是看不见的;即RR级别下只有一个read view并且不进行更新;只要被记录在m_ids中就不可见;
在RC级别下,事务执行中,每次进行快照都会重新生成一个read view,所以每次其他事务提交之后,m_ids中的内容就会做更新,然后当前事务就能够看到更新后的数据记录;
总结:RR级别只是在首次进行快照读的时候生成read view结构,而RC级别就是,每次进行快照读都会重新生成一个read view结构;
十二、各种并发场景总结
读-读:
共享锁:对表中记录进行读取时会先获取共享锁,允许多个事务进行读取记录,但是不允许修改;如果已经有事务获取了排他锁,则无法获取共享锁,只能等待排他锁释放之后,才可以获取共享锁;
当进行快照读时,由于访问的记录不是同一个,快照所以不需要进行加锁;而当进行当前读时,这是就需要获取共享锁然后对同一个记录进行读取;
写-写:
排他锁:对表中记录进行修改时会先获取排他锁,这种时候只允许一个事务访问记录,保证互斥;
由于多版本并发控制设计,所以进行写操作是并不会直接修改历史版本的(也就是快照),而是修改表中的当前记录,由于表中的当前记录只有一份,当进行修改时会存在并发问题,所以需要进行加锁,也就是写操作时的排他锁;
读-写:
对于读写并发场景,由于每一个事务的执行生命周期是不一样的,所以需要设置不同的隔离级别来实现不同的记录可见性;
RU级别:不会进行快照读,只是进行当前读,读取操作不会进行加锁,但是写操作会进行加锁,但是是行级锁,意味着其他事务可以继续的读取其他行;
RC级别:进行快照读,读操作,对于表中数据会获取共享锁,对于快照不会获取锁,进行写操作会获取排他锁;每次进行快照读都会生成一个新的读视图;
RR级别:进行快照读,读操作,对于表中数据会获取共享锁,对于快照不会获取锁,进行写操作会获取排他锁;只有首次快照读才会生成读视图;
串行化级别:不会进行快照读,只是进行当前读,所以需要进行加锁,如果是读就会获取共享锁,写操作会获取排他锁;
标签:事务,快照,补充,获取,read,MySQL,view,进行 From: https://blog.csdn.net/qq_33093885/article/details/139424200