rr隔离级别下 什么情况会一次事务内生成两次readview
时间: 2024-04-22 12:28:10 浏览: 17
在 RR(可重复读)隔离级别下,一次事务内生成两次 readview 的情况有以下几种可能性:
1. 并发事务:如果在一个事务中进行了多个并发的读操作,每个读操作都会生成一个 readview。这是因为事务在读取数据时需要创建一个快照,以便在整个事务期间保持一致的视图。
2. 多个查询:如果在同一个事务中执行了多个查询操作,每个查询都会生成一个 readview。这是因为每个查询可能会涉及不同的数据集,需要创建不同的快照来保证数据的一致性。
3. 重复读取:如果在一个事务中对同一数据进行了多次读取操作,每次读取都会生成一个 readview。这是为了确保在事务内部多次读取同一数据时,数据的一致性得到保证。
需要注意的是,RR 隔离级别下的 readview 只是在读取时创建的快照,并不代表实际的数据存储。每个 readview 只能看到事务开始时已经提交或未提交的数据,而不能看到其他并发事务中已经提交的数据。
相关问题
事务隔离级别 RC与RR
事务隔离级别RC(可重复读):允许多个事务同时读取同一行,但它禁止其他事务在一个事务未提交之前修改这一行。事务隔离级别RR(可重复读):除了允许多个事务同时读取同一行之外,它还确保在一个事务开始读取的时刻,其他事务不能修改这一行,直到该事务结束。
rr级别下同一个事务快照失效场景
在RR级别下,同一个事务的快照是由数据库引擎通过记录版本链来实现的。换言之,当一个事务读取某个数据时,数据库引擎会记录下该数据此时的版本信息(版本号、事务ID等),该信息会作为快照保存下来,供该事务后续读取使用,这个快照的有效期是整个事务期间。
在RR级别下,同一个事务的快照失效的场景有以下几种:
1. 事务更新了某个数据项,并将其提交,此时该数据项的版本信息发生了变化,如果后续该事务再次读取该数据项时,就会读取到新的版本信息,而不是之前保存的快照信息。
2. 事务在读取某个数据项时,如果该数据项的版本信息已经被其他事务更新了,则该事务读取到的是最新的版本信息,而不是之前保存的快照信息。
3. 事务在读取某个数据项时,如果该数据项的版本信息已经被其他事务删除了,则该事务读取不到该数据项,因为该数据项已经不存在了。
在以上几种情况下,同一个事务的快照就会失效。