Повторяемое чтение относительно выбора * с упорядочением и ограничением - PullRequest
0 голосов
/ 25 сентября 2019

На уровне изоляции по умолчанию mysql (Repeatable Read), если я запускаю выборку, например select * from table_a where column_a = 'a' order by id limit 100, и через некоторое время я выполняю еще одну инструкцию в той же транзакции, как select * from table_a where column_a = 'a' order by id limit 100, 101.Между тем, другая транзакция добавляется в эту таблицу с новыми записями (она не будет вставляться между ними) и фиксируется до того, как первая транзакция выполнит второй выбор.Вопрос в том, вернет ли второй выбор в первой транзакции вновь вставленные результаты второй транзакцией?

1 Ответ

0 голосов
/ 25 сентября 2019

В: «Но что меня озадачивает, так это то, что первый выбор должен создавать только моментальный снимок первых 100 записей (ограниченных 100 записей). Но почему второй выбор не возвращает вновь вставленные записи?»

A: Поскольку вновь вставленные записи по существу "не существуют" в контексте вашей транзакции.

https://dev.mysql.com/doc/refman/8.0/en/innodb-transaction-isolation-levels.html

REPEATABLE READ

Это уровень изоляции по умолчанию для InnoDB.Последовательные чтения в одной и той же транзакции считывают моментальный снимок, созданный при первом чтении.Это означает, что если вы выполните несколько простых (неблокирующих) операторов SELECT в одной транзакции, эти операторы SELECT также будут согласованы друг с другом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...