Всегда ли запрещен доступ к данным, прочитанным в другой транзакции?

«Всегда ли запрещен доступ к данным, прочитанным в другой транзакции?» — вопрос из категории Базы данных, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Нет. Возможность доступа к данным другой транзакции напрямую зависит от уровня изоляции (Isolation Level).

Уровни изоляции и что они разрешают/запрещают:

Уровень изоляции Грязное чтение (Dirty Read) Неповторяющееся чтение (Non-Repeatable Read) Фантомное чтение (Phantom Read)
READ UNCOMMITTED Разрешено Разрешено Разрешено
READ COMMITTED (часто по умолчанию) Запрещено Разрешено Разрешено
REPEATABLE READ Запрещено Запрещено Разрешено
SERIALIZABLE Запрещено Запрещено Запрещено

Практический пример в JDBC:

Connection conn = dataSource.getConnection();
// Установка уровня изоляции для текущего соединения
conn.setTransactionIsolation(Connection.TRANSACTION_REPEATABLE_READ);

Ключевые моменты:

  1. READ UNCOMMITTED позволяет видеть незафиксированные («грязные») данные других транзакций.
  2. На уровнях READ COMMITTED и выше доступ к незафиксированным данным запрещен, но доступ к уже зафиксированным данным других транзакций — разрешен.
  3. Дополнительные ограничения могут накладывать явные блокировки (например, SELECT ... FOR UPDATE).

Таким образом, доступ к данным другой транзакции не является абсолютно запрещенным — это настраиваемое поведение.