Mysql 关于select*的可重复读取,带有order by和limit

Mysql 关于select*的可重复读取,带有order by和limit,mysql,database,transactions,transaction-isolation,repeatable-read,Mysql,Database,Transactions,Transaction Isolation,Repeatable Read,在mysql的默认隔离级别(可重复读取),如果我在表a中发出select语句,如select*,其中列a='a'order by id limit 100,然后在同一事务中发出另一条语句,如select*from table_a,其中列a='a'order by id limit 100101。同时,另一个事务正在向该表添加新记录(不会在中间插入),并在第一个事务发出第二个select之前提交。问题是,第一个事务中的第二个select是否会在第二个事务中返回新插入的结果?Q:“但让我困惑的是,第

在mysql的默认隔离级别(可重复读取),如果我在表a中发出select语句,如
select*,其中列a='a'order by id limit 100
,然后在同一事务中发出另一条语句,如
select*from table_a,其中列a='a'order by id limit 100101
。同时,另一个事务正在向该表添加新记录(不会在中间插入),并在第一个事务发出第二个select之前提交。问题是,第一个事务中的第二个select是否会在第二个事务中返回新插入的结果?

Q:“但让我困惑的是,第一个select只能创建前100条记录(有限的100条记录)的快照。但为什么第二个select不返回新插入的记录?”

答:因为新插入的记录在您的事务上下文中基本上“不存在”

可重复读取

这是InnoDB的默认隔离级别。一致读取 在同一事务中读取由第一个事务创建的快照 阅读这意味着,如果发出几个普通(非锁定)命令,请选择 同一事务中的语句,这些SELECT语句是 相互之间也是一致的


我认为这取决于新行是否插入到输出的第一页,我尝试了,但没有。但让我困惑的是,第一个选择应该只创建前100条记录(有限的100条记录)的快照。但是为什么第二次选择没有返回新插入的记录呢?还有间隙锁。你所说的“输出的第一页”是什么意思?新记录只是附加的。它实际上不会在中间插入。我的意思是,如果你读ID 1 3 6,他们插入ID=2,它会改变
LIMIT 100,101
开始的位置。是的,但是第二个选择与第一个不同,对吗?第一个选择第一个100,但随后的一个选择第二个100,依此类推。因此,问题是:第一次选择所建立的快照是覆盖整个表还是仅覆盖前100个表?您为什么不回答自己的问题,用“count(*)(无“限制”)替换同一事务中的两个“选择”。确保在事务仍在进行时进行新的“插入”。让我们知道你发现了什么。