Какими механизмами обеспечивается консистентность данных в реляционной БД?

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

Ответ

Консистентность (согласованность) данных в реляционных базах обеспечивается комбинацией механизмов, основанных на принципах ACID.

Ключевые механизмы:

  1. Транзакции (Atomicity, Consistency): Группа операций выполняется как единое целое.

    Connection conn = dataSource.getConnection();
    try {
        conn.setAutoCommit(false); // Начало транзакции
        // Выполнение операций INSERT/UPDATE/DELETE
        conn.commit(); // Фиксация изменений
    } catch (SQLException e) {
        conn.rollback(); // Откат в случае ошибки
    }
  2. Уровни изоляции (Isolation): Определяют, как транзакции изолируются друг от друга (например, предотвращение "грязного" чтения).

    conn.setTransactionIsolation(Connection.TRANSACTION_READ_COMMITTED);
  3. Ограничения целостности (Constraints): Встроенные правила на уровне БД:

    • PRIMARY KEY, UNIQUE — гарантируют уникальность.
    • FOREIGN KEY — обеспечивает ссылочную целостность.
    • CHECK — проверяет данные по условию.
    • NOT NULL — запрещает пустые значения.
  4. Блокировки (Locking):

    • Пессимистичные блокировки: Заблаговременно блокируют данные для изменения.
      // JPA пример
      entityManager.find(User.class, userId, LockModeType.PESSIMISTIC_WRITE);
    • Оптимистичные блокировки: Используют версионирование для обнаружения конфликтов.
      // JPA пример с аннотацией @Version
      @Entity
      public class Account {
          @Id
          private Long id;
          @Version
          private Long version; // Поле для контроля версии
          // ... другие поля
      }
  5. Журналирование (Durability): Гарантирует, что подтвержденные транзакции не будут потеряны.