RR级别下能否读取事务ID靠后且尚未提交的记录?
参考解析
题目来源:滴滴
答案:
在使用Innodb存储引擎下MySQL读取两种读取方法,快照读与当前读。
快照读:简单的select操作(不包括 select … lock in share mode, select … for update)。
当前读:读取的是最新版本, 并且对读取的记录加锁, 阻塞其他事务同时改动相同记录,避免出现安全问题。(包括select … lock in share mode, select … for update,update.insert.delete)
假设A事务事务ID在前,B事务事务ID在后,那B事务一定是在A事务启动之后才开启的。
如果是快照读,根据前面的RR的Read View的分析,,是没有办法读取到事务ID靠后且尚未提交的记录的。因为A事务在创建Read View的时候,一定有max_trx_id <= B事务ID,根据前面的trx_id与Read View图分析,A事务无论如何也没法看到B事务修改的记录。
如果是当前读,A/B事务要想获取数据的话必须上锁,假设A事务的事务ID是100,B事务的事务ID是103,事务B更新记录(先用当前读读取了记录,即是上了锁),这里上锁又分成上共享锁(S锁)和排他锁(X锁)。
如果加的是B事务加的是X锁,无论A事务无论是加X锁还是S锁,当他要读取数据的时候,发现记录的trx_id = 103且尚未提交,那么必须等B事务提交后(即释放X锁后)A事务才能继续读取数据。
如果B事务加的是S锁,而A事务加的是S锁,则B事务的修改记录可见(S锁可以在S锁上加锁,即两者兼容),如果A事务加的是X锁,则与上述一样,需等B事务解锁后(即提交后)A事务才可见。