Я не уверен насчет MySql, но я знаю, что в SQL Server операторы select НЕ читаются против блокировок.Это позволит вам прочитать незафиксированные данные и, возможно, увидеть повторяющиеся записи или полностью пропустить запись.Причина этого в том, что, если другой процесс записывает данные в таблицу, ядро базы данных может решить, что пришло время реорганизовать некоторые данные и перенести их на диск.Таким образом, он перемещает запись, которую вы уже прочитали, в конец, и вы видите ее снова, или он перемещает одну запись в конец выше, где вы уже прошли.
В сети где-то есть парень, который фактически написалпару сценариев, чтобы доказать, что это происходит, и я попробовал их один раз, и потребовалось всего несколько секунд, прежде чем появился дубликат.Конечно, он разработал сценарии таким образом, чтобы это было более вероятным, но это доказывает, что это определенно может произойти.
Это нормальное поведение, если ваши данные не должны быть точными и могутбезусловно, поможет предотвратить тупики.Однако, если вы работаете с приложением, работающим с чем-то вроде денег людей, это очень плохо.
В SQL Server вы можете использовать подсказку WITH NOLOCK, чтобы сказать вашему оператору select игнорировать блокировки.Я не уверен, каким будет эквивалент в MySql, но, может быть, кто-то еще скажет.