Уровень изоляции транзакции InnoDB REPEATABLE-READ предотвращает появление фантомных строк, но только в том случае, если ваш запрос SELECT является неблокирующим запросом.
Таким образом, вы можете ВЫБРАТЬ с одними и теми же условиями запроса несколько раз во время транзакции, и вы гарантированно будете получать один и тот же результат раз за разом, даже когда другие сеансы вставляют, обновляют или удаляют строки способами, которые могут повлиять на ваш набор результатов. Как только вы начнете новую транзакцию, ваш запрос увидит изменения в строках, которые происходили за это время.
Но у InnoDB есть странный случай: если вы запускаете блокирующий запрос на чтение , например, один из следующих:
SELECT * FROM t1 WHERE c1 < 10 FOR UPDATE
SELECT * FROM t1 WHERE c1 < 10 LOCK IN SHARE MODE
SELECT * FROM t1 WHERE c1 < 10 FOR SHARE -- MySQL 8.0 syntax
Тогда SELECT «увидит» результаты одновременных изменений данных, как если бы ваша транзакция была запущена как транзакция READ-COMMITTED.
Вы можете даже переключаться между блокирующими запросами на чтение и неблокирующими запросами на чтение в одной и той же транзакции REPEATABLE-READ, и вы увидите разные наборы результатов для каждого. Так что помните об этом, если вы используете блокирующие операторы SELECT.
Я думаю, что слово «генерировать» в приведенной вами выдержке предназначено для обозначения INSERT или UPDATE. Им нужен был термин, чтобы подать заявку в обоих случаях, потому что, я думаю, им не хотелось писать более четкую фразу типа «вставить или обновить».