|
77 | 77 | *Транзакции работают* с *данными*, используя *операции чтения* и *записи*. |
78 | 78 |
|
79 | 79 | ### Свойства транзакции (ACID) |
80 | | -* **Атомарность** (англ. **A**tomicity) гарантирует, что транзакция не может быть зафиксирована частично: либо выполняются все подоперации транзакции, либо ни одна. Если какая-то операция из последовательности не проходит, то происходит откат (rollback) всей последовательности. |
| 80 | +* **Атомарность** (англ. **A**tomicity) гарантирует, что транзакция не может быть зафиксирована частично: либо выполняются все подоперации транзакции, либо ни одна. Если какая-то операция из последовательности не проходит, то происходит откат (англ. `rollback`) всей последовательности. |
81 | 81 | * **Согласованность, консистентность** (англ. **C**onsistency). Каждая успешная транзакция фиксирует только допустимый для системы результат. База данных должна быть согласованна до и после транзакции, во время проведения транзакции согласованность не требуется. |
82 | | -* **Изолированность** (англ. **I**solation). Во время выполнения транзакции другие параллельные транзакции не должны оказывать влияния на её результат. Требование дорогое, поэтому в реальных базах транзакции изолируются не полностью: создаются уровни изолированности. |
| 82 | +* **Изолированность** (англ. **I**solation). Cпособность базы данных гарантировать, что *параллельно выполняющиеся транзакции не мешают друг другу*. Во время выполнения транзакции другие параллельные транзакции не должны оказывать влияния на её результат. Требование "дорогое", поэтому в реальных базах транзакции изолируются не полностью: создаются *уровни изолированности*. |
83 | 83 | * **Долговечность** (англ. **D**urability). Если пользователь получил подтверждение от системы, что транзакция выполнена, он может быть уверен, что сделанные им изменения не будут отменены из-за какого-либо сбоя. Изменения, сделанные успешно завершённой транзакцией, должны остаться сохранёнными после возвращения системы в работу. |
84 | 84 |
|
85 | 85 | ### Пример транзакции |
86 | 86 |
|
87 | 87 | Пусть деньги переводятся с одного счёта на другой. Используются две основные операции: вывод денег с одного счёта `1000$ - 100$ = 400$`, зачисление их на другой счёт `500$ + 100$ = 600$`. Если первая операция удалась, а вторая нет, то происходит откат, поскольку в противном случае имеем несогласованность (inconsistency) данных до и после транзакции: до транзакции на счетах в сумме было `1500$`, после — `1400$`. |
88 | 88 |
|
| 89 | +### Уровни изолированности транзакций (Transaction Isolation Levels) |
| 90 | +**Уровни изолированности транзакций** (англ. `Transaction Isolation Levels`) — фундаментальная концепция в реляционных базах данных, которая определяет, как транзакции изолированы друг от друга и какие “аномалии” могут или не могут возникнуть при одновременном доступе к данным. |
| 91 | + |
| 92 | +Уровни: |
| 93 | +* **Чтение неподтверждённых данных** (англ. `Read Uncommitted`) - можно читать неподтвержненные данные (грязное чтение). Грязные чтения, неповторяющиеся чтения, фантомные чтения возможны. |
| 94 | +* **Чтение подтверждённых данных** (англ. `Read Committed`) - можно читать лишь подтверждённые данные (грязное чтение невозможно). Неповторяющиеся чтения, фантомные чтения возможны. |
| 95 | +* **Повторяемое чтение** (англ. `Repeatable Read`) - все данные, прочитанные в транзакции, будут *одинаковыми при повторном чтении*. Грязное и неповторяющиеся чтения невозможны. Возможны фантомные чтения. |
| 96 | +* **Сериализуемость** (англ. `Serializable`) - полная изолированность, максимальная защита от всех аномалий. |
| 97 | + |
| 98 | +Примеры применения: |
| 99 | +``` |
| 100 | +-- PostgreSQL |
| 101 | +BEGIN TRANSACTION ISOLATION LEVEL SERIALIZABLE; |
| 102 | +
|
| 103 | +-- MySQL |
| 104 | +SET TRANSACTION ISOLATION LEVEL REPEATABLE READ; |
| 105 | +START TRANSACTION; |
| 106 | +``` |
| 107 | + |
| 108 | +### Аномалии |
| 109 | +* **Грязное чтение** (англ. `Dirty read`) - транзакции читают данные, которые ещё не подтверждены другой транзакцией. |
| 110 | +* **Неповторябщееся чтение** (англ. `Non-repeatable read`) - повторное чтение тех же данных возвращает различные значения. |
| 111 | +* **Фантомное чтение** (англ. `Phantom read`) - повторное чтение тех же данных возвращает новые строки, добавленные другой транзакцией. |
| 112 | + |
| 113 | +### Выбор уровня изолированности |
| 114 | +* **Read Committed** - максимальная производительность, мало конфликтов. |
| 115 | +* **Repeatable read** - стабильное чтение, терпимы фантомы |
| 116 | +* **Serializable** - критичные данные, важно избегать любых конфликтов |
| 117 | + |
| 118 | + |
89 | 119 | ## Индекс базы данных |
90 | 120 | - [Об индексе базы данных](#об-индексе-базы-данных) |
91 | 121 | - [Проблема дублирования данных](#проблема-дублирования-данных) |
|
0 commit comments