Что такое Non-repeatable read

«Что такое Non-repeatable read» — вопрос из категории Базы данных, который задают на 23% собеседований Android Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

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 с нужным уровнем изоляции.