СУБД - Транзакция: Понимание Основ и Больше

Здравствуйте, будущие маги баз данных! Я рад带领你们进入数据库事务的迷人世界. Как ваш доброжелательный сосед по компьютерным наукам, я видел, как countless студенты мучаются с этой темой, но я обещаю вам, к концу этого учебника, вы станете экспертами по транзакциям! Давайте окунемся!

DBMS - Transaction

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

Прежде чем мы перейдем к деталям, давайте начнем с основ. Представьте, что вы на банкомате, снимаете деньги. Вы вставляете карту, вводите ПИН-код, выбираете сумму и забираете наличные. Весь этот процесс, от начала до конца, является транзакцией. В терминах базы данных транзакция - этоsequence операций, выполняемых как единое логическое целое работы.

Вот пример того, как может выглядеть транзакция в pseudocode:

BEGIN TRANSACTION
ЧИТАТЬ balance ИЗ account WHERE id = 12345
ЕСЛИ balance >= 100 ТО
ОБНОВИТЬ account SET balance = balance - 100 WHERE id = 12345
ВЫДАТЬ 100 долларов
ИНАЧЕ
ВЫВЕСТИ "Недостаточно средств"
КОНЕЦ ЕСЛИ
COMMIT TRANSACTION

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

Свойства ACID

Теперь давайте поговорим о четырех pillar транзакций, известных как свойства ACID. Они критически важны для поддержания целостности и consistence данных в системе баз данных.

Атомарность

Атомарность гарантирует, что транзакция рассматривается как единое, неделимое целое. Это все или ничего - либо все операции в транзакции успешно завершены, либо none.

Пример:

BEGIN TRANSACTION;
ОБНОВИТЬ accounts SET balance = balance - 100 WHERE id = 'Alice';
ОБНОВИТЬ accounts SET balance = balance + 100 WHERE id = 'Bob';
COMMIT;

Если какая-либо часть этой транзакции fails (например, счет Bob не существует), вся транзакция откатывается, и баланс Alice остается неизменным.

Consistency

Целостность гарантирует, что транзакция переводит базу данных из одногоvalid состояния в другое. Она поддерживает ограничения целостности базы данных.

Пример: Давайте представим, что у нас есть правило, что все balances счетов должны быть положительными.

BEGIN TRANSACTION;
ОБНОВИТЬ accounts SET balance = balance - 200 WHERE id = 'Alice';
-- Если баланс Alice становится отрицательным, транзакция будет отменена
COMMIT;

Изоляция

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

Пример: Представьте, что одновременно выполняются две транзакции:

-- Транзакция 1
BEGIN TRANSACTION;
ОБНОВИТЬ accounts SET balance = balance - 100 WHERE id = 'Alice';
-- Некоторая задержка occurs здесь
ОБНОВИТЬ accounts SET balance = balance + 100 WHERE id = 'Bob';
COMMIT;

-- Транзакция 2
BEGIN TRANSACTION;
ВЫБРАТЬ balance ИЗ accounts WHERE id = 'Alice';
COMMIT;

Изоляция гарантирует, что Transaction 2 увидит баланс Alice или до перевода, или после него, но никогда не между ними.

Долговечность

Долговечность гарантирует, что после того, как транзакция была committed, она останется такой, даже в случае потери энергии, сбоев или ошибок.

Пример: После выполнения этой транзакции:

BEGIN TRANSACTION;
ВСТАВИТЬ В audit_log (action, timestamp) ЗНАЧЕНИЯ ('User login', CURRENT_TIMESTAMP);
COMMIT;

Вставленная запись будет persisted, даже если система crash сразу после.

Сериализуемость

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

Давайте рассмотрим пример:

Транзакция 1: R(X), W(X)
Транзакция 2: R(X), W(X)

Возможные seriаl schedules:

  1. T1 за T2: R1(X), W1(X), R2(X), W2(X)
  2. T2 за T1: R2(X), W2(X), R1(X), W1(X)

Одновременное расписание является сериализуемым, если его результат эквивалентен одному из этих seriаl schedules.

Эквивалентные расписания

Два расписания считаются эквивалентными, если:

  1. Они включают один и тот же набор транзакций
  2. Они заказывают конфликтующие операции несброшенных транзакций одинаково

Давайте рассмотрим пример:

Schedule 1: R1(X), R2(X), W1(X), W2(X) Schedule 2: R2(X), R1(X), W1(X), W2(X)

Эти расписания эквивалентны, потому что конфликтующие операции (W1(X) и W2(X)) в том же порядке в обоих расписаниях.

Состояния транзакций

Транзакции проходят через различные состояния в течение их жизненного цикла. Вот таблица, резюмирующая эти состояния:

State Описание
Active Начальное состояние; транзакция остается в этом состоянии, пока выполняется
Partially Committed После выполнения последнего предложения
Failed После того, как обнаружено, что нормальное выполнение больше не может продолжаться
Aborted После того, как транзакция была откатана и база данных восстановлена до состояния до начала транзакции
Committed После успешного завершения транзакции

Понимание этих состояний важно для эффективного управления транзакциями и обеспечения целостности данных.

В заключение, транзакции являются fundamental concept в системах управления базами данных, обеспечивая consistence и integrity данных. Понимая свойства ACID, сериализуемость, эквивалентные расписания и состояния транзакций, вы на пути к тому, чтобы стать экспертом по базам данных!

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

Credits: Image by storyset