Транзакции

пятница, окт. 17, 2025 | 3 минуты чтения

Транзакции

Транзакции

ACID

  • Atomacity - Атомраность -Транзакци выполняется полностью или не выполнена совсем
  • Consistency - Согласованность - После завершения транзакции бд остаётся в согласованном состоянии, то есть не возникает нарушений ограничений целостности
    • ограничения целостности
      • NOT nullUNIQUE
      • PRIMARY key
      • FOREIGN KEY
      • check - проверка условий
      • exclusion constrants - расширенные ограничения
  • Isolation - Изоляция - Параллельные транзакции выполняются так, как если бы они были последовательными, предотвращая конфликты данных
  • Durability - Долговечность - После фиксации (COMMIT) изменения остаются в базе данных, даже если система выйдет из строя

Изоляция транзакций

  • read uncomitted - позволяет читаь даже незавершённые изменения других транзакиц (есть в sql, но не в постгресе)
  • read commited (по умолчанию) - транзакция видит только зафиксированные (commi) изменения других транзакций
  • repeatable read - транзакция видит данные в том виде, в каком они были на момент её начала, даже если другие транзакции вносят изменения
  • serializable - максимальный уровень изоляции. Гарантирует, что параллельные транзакции выполняются так, как если бы они шли последовательно

Аномалии

  • Потерянное обновление - такая аномалия возникает, когда две транзакции читают одну и ту же строку таблицы, затем одна транзакция обновляет эту строку, а после этого вторая транзакция тоже обновляет ту же строку, не учитывая изменений, сделанных первой транзакцией
  • Грязное чтение - такая аномалия возникает, когда транзакция читает еще не зафиксированные изменения, сделанные другой транзакцией
  • Фантомное чтение - возникает тогда, когда транзакция два раза читает набор строк по одному и тому же условию, и в промежутке между чтениями вторая транзакция добавляет строки, удовлетворяющие этому условию (и фиксирует изменения), Тогда первая транзакция получает разные наборы строк

Serializable

Уровень Serializable должен предотвращать вообще все аномалии. Это означает, что на таком уровне разработчику приложения не надо думать об одновременном выполнении. Если транзакции выполняют корректные последовательности операторов, работая в одиночку, данные будут согласованы и при одновременной работе этих транзакций

Аномалии сериализации

  • Циклическая зависимость данных (Write skew)

Почему именно такие уровни в стандарте?

  • Разница между уровнями изоляции стандарта объясняется как раз количеством необходимых блокировок
  • Если транзакция блокирует изменяемые строки от изменения, но не от чтения, получаем уровень Read Uncommitted
  • Если транзакция блокирует изменяемые строки и от чтения, и от изменения получаем уровень Read Committed
  • Если транзакция блокирует и читаемые, и изменяемые строки и от чтения, и от изменения, получаем уровень Repeatable Read
  • Но с Serializable проблема: невозможно заблокировать строку, которой еще нет. Из-за этого остается возможность фантомного чтения. поэтому для реализации уровня Serializable обычных блокировок не хватает - нужно блокировать не строки, а условия (предикаты). Такие блокировки и были названы предикатными

Write-Ahead Logging

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

    Структура WAL

    • Header (24 байта)
    • Page ID (8 байт)
    • Old Data (Размер страницы)
    • New Data (Размер страницы)
    • Checksum (8 байт)
	fsync = on
	synchronous_commit = on
	wal_buffers = 64MB

synchronous_commit

  • on
  • off
  • local
  • remote_write
  • remote_apply

checkpoint

  • это процесс, при котором все изменяемые данные из буферного кэша сбрасываются на диск, создавая согласованное состояние базы данных

🌱 Авторы:
salt-caramel
notakeith