← Назад к вопросам

Что такое D (долговечность) в принципах ACID?

2.7 Senior🔥 231 комментариев
#DevOps и инфраструктура

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI23 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Долговечность (Durability) в ACID

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

Суть принципа

Когда транзакция успешно завершена (COMMIT), её изменения становятся постоянными. Ни один отказ системы не должен привести к потере уже подтверждённых данных. Это обеспечивает надёжность и предсказуемость работы базы данных.

Механизмы реализации Durability

Write-Ahead Logging (WAL) — самый распространённый механизм:

  • Перед изменением данных в памяти все изменения записываются в журнал на диск
  • Только после успешной записи в журнал изменение применяется
  • При восстановлении журнал воспроизводится для восстановления состояния
# Пример логики WAL при работе с БД
import sqlite3

conn = sqlite3.connect(":memory:")
cursor = conn.cursor()

# Начало транзакции
cursor.execute("BEGIN TRANSACTION")
cursor.execute("INSERT INTO accounts (id, balance) VALUES (1, 1000)")
# Записывается в WAL
cursor.execute("INSERT INTO accounts (id, balance) VALUES (2, 500)")

# COMMIT гарантирует долговечность
conn.commit()  # Изменения зафиксированы навсегда

Репликация данных — дублирование данных на нескольких узлах:

  • Изменения синхронно или асинхронно копируются на другие серверы
  • Если один узел отказал, данные сохранены на других
  • Обеспечивает как долговечность, так и отказоустойчивость

Контрольные точки (Checkpoints):

  • Периодически состояние БД записывается на диск
  • Сокращает время восстановления при сбоях
  • Позволяет удалять старые части журнала

Долговечность в различных системах

SQLite:

import sqlite3

conn = sqlite3.connect("database.db")
# SQLite по умолчанию использует WAL и гарантирует долговечность
conn.execute("INSERT INTO users VALUES (1, Alice)")
conn.commit()  # Данные гарантированно на диске

PostgreSQL:

  • Использует WAL (Write-Ahead Logging)
  • COMMIT блокирует, пока данные не записаны на диск
  • Поддерживает синхронную репликацию
import psycopg2

conn = psycopg2.connect("dbname=mydb user=postgres")
cursor = conn.cursor()
cursor.execute("INSERT INTO products VALUES (1, Laptop, 1000)")
conn.commit()  # Гарантированно долговечно

Компромиссы между производительностью и долговечностью

Полная долговечность требует синхронной записи на диск, что замедляет операции. Системы часто предлагают компромиссы:

# Асинхронная репликация — быстрее, но риск потери данных
conn.execute("INSERT INTO events VALUES (...)", async=True)

# Синхронная репликация — медленнее, но безопаснее
conn.execute("INSERT INTO critical_data VALUES (...)", sync=True)

Практическое значение

Долговечность критична для:

  • Финансовых систем (банковские операции)
  • E-commerce (заказы, платежи)
  • Критичных систем с требованиями к целостности данных

Нарушение принципа долговечности приводит к потере данных и нарушению бизнес-логики.

В ACID, долговечность работает в паре с Атомарностью — либо вся транзакция зафиксирована навсегда, либо ничего не было.

Что такое D (долговечность) в принципах ACID? | PrepBro