Что такое консистентность (согласованность) в контексте баз данных и систем?

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

Ответ

Консистентность (согласованность) — это свойство системы, гарантирующее, что данные всегда находятся в допустимом, корректном состоянии, даже при параллельных операциях или сбоях. Она обеспечивает соблюдение всех заданных правил, ограничений и инвариантов.

Уровни консистентности:

  1. Строгая (Strong): Любое чтение возвращает результат самой последней завершённой записи.
  2. Последовательная (Sequential): Операции всех процессов видны в одном порядке.
  3. Конечная (Eventual): При отсутствии новых записей система в конечном счёте приходит к согласованному состоянию (характерно для распределённых систем, согласно CAP-теореме).

Как достигается в Java-приложениях?

Через механизмы синхронизации:

  • Ключевое слово synchronized.
  • Модификатор volatile.
  • Классы из java.util.concurrent.locks (например, ReentrantLock).
  • Потокобезопасные коллекции (ConcurrentHashMap, CopyOnWriteArrayList).

Пример нарушения и обеспечения консистентности:

// НЕКОНСИСТЕНТНЫЙ счётчик (гонка данных)
class UnsafeCounter {
    private int count = 0;
    public void increment() { count++; } // Неатомарная операция!
    public int get() { return count; }
}

// КОНСИСТЕНТНЫЙ счётчик с синхронизацией
class SafeCounter {
    private int count = 0;
    public synchronized void increment() { count++; } // Атомарная операция
    public synchronized int get() { return count; }
}

Без синхронизации два потока, одновременно вызывающие increment(), могут прочитать одно значение, увеличить его и записать обратно, что приведёт к потере одного обновления.