Ответ
Non-repeatable read — это ситуация, когда в рамках одной транзакции повторное чтение одних и тех же данных возвращает разные значения из-за изменений, внесённых другой транзакцией.
Пример:
// Транзакция 1
val firstRead = database.getUserBalance(1) // 100$
// Транзакция 2 обновляет баланс: UPDATE users SET balance = 50 WHERE id = 1
val secondRead = database.getUserBalance(1) // 50$ (изменилось!)
Как избежать: Использовать уровень изоляции REPEATABLE_READ или блокировки (SELECT FOR UPDATE). В Room/SQLite можно настроить через @Transaction с нужным уровнем изоляции.