Что такое транзакция?
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(): Закрываем соединение с базой данных.
🔒 Подпишись на бусти автора и стань Алигатором, чтобы получить полный доступ к функционалу сайта и отслеживать свой прогресс!
Подписаться