Skip to content

Commit 7193261

Browse files
authored
Update DataModels-Databases.md
1 parent c6f16c1 commit 7193261

File tree

1 file changed

+32
-2
lines changed

1 file changed

+32
-2
lines changed

DataModels-Databases.md

Lines changed: 32 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -77,15 +77,45 @@
7777
*Транзакции работают* с *данными*, используя *операции чтения* и *записи*.
7878

7979
### Свойства транзакции (ACID)
80-
* **Атомарность** (англ. **A**tomicity) гарантирует, что транзакция не может быть зафиксирована частично: либо выполняются все подоперации транзакции, либо ни одна. Если какая-то операция из последовательности не проходит, то происходит откат (rollback) всей последовательности.
80+
* **Атомарность** (англ. **A**tomicity) гарантирует, что транзакция не может быть зафиксирована частично: либо выполняются все подоперации транзакции, либо ни одна. Если какая-то операция из последовательности не проходит, то происходит откат (англ. `rollback`) всей последовательности.
8181
* **Согласованность, консистентность** (англ. **C**onsistency). Каждая успешная транзакция фиксирует только допустимый для системы результат. База данных должна быть согласованна до и после транзакции, во время проведения транзакции согласованность не требуется.
82-
* **Изолированность** (англ. **I**solation). Во время выполнения транзакции другие параллельные транзакции не должны оказывать влияния на её результат. Требование дорогое, поэтому в реальных базах транзакции изолируются не полностью: создаются уровни изолированности.
82+
* **Изолированность** (англ. **I**solation). Cпособность базы данных гарантировать, что *параллельно выполняющиеся транзакции не мешают друг другу*. Во время выполнения транзакции другие параллельные транзакции не должны оказывать влияния на её результат. Требование "дорогое", поэтому в реальных базах транзакции изолируются не полностью: создаются *уровни изолированности*.
8383
* **Долговечность** (англ. **D**urability). Если пользователь получил подтверждение от системы, что транзакция выполнена, он может быть уверен, что сделанные им изменения не будут отменены из-за какого-либо сбоя. Изменения, сделанные успешно завершённой транзакцией, должны остаться сохранёнными после возвращения системы в работу.
8484

8585
### Пример транзакции
8686

8787
Пусть деньги переводятся с одного счёта на другой. Используются две основные операции: вывод денег с одного счёта `1000$ - 100$ = 400$`, зачисление их на другой счёт `500$ + 100$ = 600$`. Если первая операция удалась, а вторая нет, то происходит откат, поскольку в противном случае имеем несогласованность (inconsistency) данных до и после транзакции: до транзакции на счетах в сумме было `1500$`, после — `1400$`.
8888

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+
89119
## Индекс базы данных
90120
- [Об индексе базы данных](#об-индексе-базы-данных)
91121
- [Проблема дублирования данных](#проблема-дублирования-данных)

0 commit comments

Comments
 (0)