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

Что такое транзакция?

1️⃣ Как кратко ответить

Транзакция — это последовательность операций, выполняемых как единое целое, с целью обеспечения целостности данных. Она обладает свойствами ACID: атомарность, согласованность, изолированность и долговечность. Используется для гарантии, что все операции в транзакции выполнены успешно или ни одна из них не выполнена.

2️⃣ Подробное объяснение темы

Транзакция в контексте баз данных и систем управления базами данных (СУБД) — это набор операций, которые выполняются как единое целое. Если одна из операций в транзакции не может быть завершена, все операции откатываются, чтобы сохранить целостность данных. Это особенно важно в системах, где данные должны оставаться в согласованном состоянии, несмотря на сбои или ошибки.

Свойства ACID

Транзакции характеризуются четырьмя основными свойствами, известными как ACID:

  • Атомарность (Atomicity): Гарантирует, что все операции в транзакции выполняются полностью или не выполняются вовсе. Если одна из операций не может быть завершена, все изменения, сделанные в рамках транзакции, откатываются.

  • Согласованность (Consistency): Обеспечивает, что транзакция переводит базу данных из одного согласованного состояния в другое. Это означает, что после завершения транзакции все правила и ограничения базы данных остаются соблюденными.

  • Изолированность (Isolation): Обеспечивает, что параллельные транзакции не влияют друг на друга. Изменения, сделанные одной транзакцией, не видны другим до тех пор, пока транзакция не будет завершена.

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

Пример использования транзакции

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

import sqlite3
​
# Подключение к базе данных
connection = sqlite3.connect('bank.db')
cursor = connection.cursor()
​
try:
    # Начало транзакции
    connection.execute('BEGIN')
​
    # Уменьшение баланса счета A
    cursor.execute('UPDATE accounts SET balance = balance - 100 WHERE account_id = 1')
​
    # Увеличение баланса счета B
    cursor.execute('UPDATE accounts SET balance = balance + 100 WHERE account_id = 2')
​
    # Фиксация транзакции
    connection.commit()
​
except Exception as e:
    # Откат транзакции в случае ошибки
    connection.rollback()
    print(f"Transaction failed: {e}")
​
finally:
    # Закрытие соединения с базой данных
    connection.close()
  • import sqlite3: Импортируем модуль для работы с SQLite базой данных.
  • connection = sqlite3.connect('bank.db'): Устанавливаем соединение с базой данных bank.db.
  • cursor = connection.cursor(): Создаем курсор для выполнения SQL-запросов.
  • connection.execute('BEGIN'): Начинаем транзакцию.
  • cursor.execute(...): Выполняем SQL-запросы для изменения балансов счетов.
  • connection.commit(): Фиксируем транзакцию, если все операции выполнены успешно.
  • connection.rollback(): Откатываем транзакцию в случае ошибки, чтобы отменить все изменения.
  • connection.close(): Закрываем соединение с базой данных.

Тема: Базы данных
Стадия: Tech

🔒 Подпишись на бусти автора и стань Алигатором, чтобы получить полный доступ к функционалу сайта и отслеживать свой прогресс!

Твои заметки