rr级别下同一个事务快照失效场景
时间: 2023-07-12 13:52:02 浏览: 54
在RR级别下,同一个事务的快照是由数据库引擎通过记录版本链来实现的。换言之,当一个事务读取某个数据时,数据库引擎会记录下该数据此时的版本信息(版本号、事务ID等),该信息会作为快照保存下来,供该事务后续读取使用,这个快照的有效期是整个事务期间。
在RR级别下,同一个事务的快照失效的场景有以下几种:
1. 事务更新了某个数据项,并将其提交,此时该数据项的版本信息发生了变化,如果后续该事务再次读取该数据项时,就会读取到新的版本信息,而不是之前保存的快照信息。
2. 事务在读取某个数据项时,如果该数据项的版本信息已经被其他事务更新了,则该事务读取到的是最新的版本信息,而不是之前保存的快照信息。
3. 事务在读取某个数据项时,如果该数据项的版本信息已经被其他事务删除了,则该事务读取不到该数据项,因为该数据项已经不存在了。
在以上几种情况下,同一个事务的快照就会失效。
相关问题
那你上面说rr级别下没有快照读
非常抱歉,我的回答有误。在 MySQL 的可重复读(Repeatable Read)隔离级别下,确实是使用快照读(Snapshot Read)机制,而不是读已提交(Read Committed)隔离级别下的当前读(Current Read)机制。在可重复读隔离级别下,MySQL 在事务开始时创建一个快照,并在整个事务期间使用该快照来读取数据,以保证读取的数据是一致的。这种机制避免了脏读和不可重复读的问题,但仍然可能存在幻读的问题。非常抱歉给您造成困扰。
rc级别下的当前读快照读,和rr级别下有什么区别
rc级别下的当前读(Read Committed)和快照读(Snapshot Read)是在事务中进行的读取操作,而rr级别下则没有快照读的概念。
在rc级别下,当前读是指读取最新提交的数据,并且在事务中其他操作还未提交之前,其他事务不可见当前事务所做的修改。而快照读则是指读取当前事务开始时的数据快照,并且在事务中其他操作还未提交之前,其他事务不可见当前事务所做的修改。
相比之下,在rr级别下,只有当前读,没有快照读。当前读也是读取最新提交的数据,并且在事务中其他操作还未提交之前,其他事务不可见当前事务所做的修改。但是,rr级别下的当前读会在事务中一直保持锁住状态,直到事务结束,这可能会导致其他事务的阻塞。
因此,rc级别下的快照读可以提高并发性能,但是会牺牲一定的数据一致性。而rr级别下只有当前读,可以保证数据的一致性,但是可能会牺牲并发性能。