Ключевое отличие между грязным чтением и неповторяющимся чтением заключается в характере изменений, которые происходят с данными.
Грязное чтение (англ. dirty read) — это ситуация, когда транзакция считывает ещё не зафиксированные изменения, сделанные другой транзакцией. habr.com aristov.tech Например, первая транзакция переводит все деньги со счёта клиента на другой счёт, но не фиксирует изменение. habr.com Другая транзакция читает состояние счёта, получает 0 рублей и отказывает клиенту в выдаче наличных, хотя значения 0 никогда не существовало в базе данных. habr.com
Неповторяющееся чтение (англ. non-repeatable read) — это ситуация, когда при повторном чтении в рамках одной транзакции ранее прочитанные данные оказываются изменёнными. ru.wikipedia.org Например, первая транзакция собирается уменьшить сумму на счёте на 100 рублей, проверяет текущее значение, получает 1000 рублей и решает, что уменьшение возможно. habr.com В это время вторая транзакция уменьшает сумму на счёте до нуля и фиксирует изменения. habr.com Если бы теперь первая транзакция повторно проверила сумму, она получила бы 0 рублей, но уже приняла решение уменьшить значение, и счёт «уходит в минус». habr.com
Таким образом, при грязном чтении считываются незафиксированные изменения, а при неповторяющемся чтении — успешно зафиксированные изменения при выполнении одного и того же запроса несколько раз. stackoverflow.com