СУБД - Транзакция: Понимание Основ и Больше
Здравствуйте, будущие маги баз данных! Я рад带领你们进入数据库事务的迷人世界. Как ваш доброжелательный сосед по компьютерным наукам, я видел, как countless студенты мучаются с этой темой, но я обещаю вам, к концу этого учебника, вы станете экспертами по транзакциям! Давайте окунемся!
Что такое транзакция?
Прежде чем мы перейдем к деталям, давайте начнем с основ. Представьте, что вы на банкомате, снимаете деньги. Вы вставляете карту, вводите ПИН-код, выбираете сумму и забираете наличные. Весь этот процесс, от начала до конца, является транзакцией. В терминах базы данных транзакция - это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:
- T1 за T2: R1(X), W1(X), R2(X), W2(X)
- T2 за T1: R2(X), W2(X), R1(X), W1(X)
Одновременное расписание является сериализуемым, если его результат эквивалентен одному из этих seriаl schedules.
Эквивалентные расписания
Два расписания считаются эквивалентными, если:
- Они включают один и тот же набор транзакций
- Они заказывают конфликтующие операции несброшенных транзакций одинаково
Давайте рассмотрим пример:
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