1) Ваш первый пункт неверен: уровень изоляции по умолчанию для Read Committed означает, что не будет выполнено грязное чтение (хотя могут выполняться фантомные или не повторяемые чтения). Это не гарантирует, что отдельные строки заблокированы.
Неповторяемое чтение может произойти в следующей ситуации:
1. Transaction 1 begins
2. Transaction 1 read a row
3. Transaction 2 begins
4. Transaction 2 changes the value of the same row read by Transaction 1
5. Transaction 2 commits
6. Transaction 1 reads the row again. Transaction 1 has inconsistent data.
2) Уровень изоляции Repeatable Read означает, что вышеописанная ситуация не может возникнуть (хотя фантомное чтение все еще может). Фантомное чтение может произойти в следующей ситуации:
1. Transaction 1 begins
2. Transaction 1 read a row
3. Transaction 2 begins
4. Transaction 2 deletes the row read by Transaction 1
5. Transaction 2 commits. Transaction 1 can no longer repeat its initial read,
since the row no longer exists.
Если вы хотите гарантировать, что данные не изменятся во время чтения, вам потребуется уровень изоляции Serializable. Я бы настоятельно рекомендовал agianst не использовать уровень изоляции Serializable, если только вам это не нужно, так как параллелизм пострадает.