diff --git a/.obsidian/plugins/home-tab/data.json b/.obsidian/plugins/home-tab/data.json index c41c830b..67173b82 100644 --- a/.obsidian/plugins/home-tab/data.json +++ b/.obsidian/plugins/home-tab/data.json @@ -24,12 +24,16 @@ "unresolvedLinks": false, "recentFilesStore": [ { - "filepath": "_inbox/Read committed.md", - "timestamp": 1718902353249 + "filepath": "_inbox/MVCC.md", + "timestamp": 1718902462965 }, { - "filepath": "_inbox/MVCC.md", - "timestamp": 1718902317013 + "filepath": "_inbox/Repeatable read.md", + "timestamp": 1718902423445 + }, + { + "filepath": "_inbox/Read committed.md", + "timestamp": 1718902353249 }, { "filepath": "_inbox/Блокировки.md", @@ -38,10 +42,6 @@ { "filepath": "_inbox/Deadlock.md", "timestamp": 1718901920086 - }, - { - "filepath": "_inbox/Two Phase Lock.md", - "timestamp": 1718901445162 } ], "bookmarkedFileStore": [], diff --git a/.obsidian/plugins/recent-files-obsidian/data.json b/.obsidian/plugins/recent-files-obsidian/data.json index bbe92e08..848af18b 100644 --- a/.obsidian/plugins/recent-files-obsidian/data.json +++ b/.obsidian/plugins/recent-files-obsidian/data.json @@ -1,13 +1,17 @@ { "recentFiles": [ - { - "basename": "Read committed", - "path": "_inbox/Read committed.md" - }, { "basename": "MVCC", "path": "_inbox/MVCC.md" }, + { + "basename": "Repeatable read", + "path": "_inbox/Repeatable read.md" + }, + { + "basename": "Read committed", + "path": "_inbox/Read committed.md" + }, { "basename": "Блокировки", "path": "_inbox/Блокировки.md" @@ -60,10 +64,6 @@ "basename": "Согласованное префиксное чтение", "path": "_inbox/Согласованное префиксное чтение.md" }, - { - "basename": "Repeatable read", - "path": "_inbox/Repeatable read.md" - }, { "basename": "Неповторяющееся чтение", "path": "_inbox/Неповторяющееся чтение.md" diff --git a/_inbox/MVCC.md b/_inbox/MVCC.md index 402c7c93..09675c6d 100644 --- a/_inbox/MVCC.md +++ b/_inbox/MVCC.md @@ -6,9 +6,18 @@ date: - - 2024-06-19 zero-link: - "[[00 Базы Данных]]" -parents: +parents: + - "[[Транзакция БД]]" linked: --- +Реализация может отличаться в зависимости от СУБД. + +У каждой транзакции есть идентификатор. У каждой записи появляется мета-информация updated_by(tx_id) и deleted_by(tx_id). На основе этой информации можно понять видит ли транзакция эту запись или нет. + +Например: +- deleted_by(n+1). Транзакция n эту запись видит. +- deleted_by(n-4). Транзакция n эту запись не видит. + В начале каждой транзакции база данных создает список всех остальных выполняемых на текущий момент транзакций (но еще не зафиксированных или прерванных). Все выполненные этими транзакциями изменения игнорируются, даже если впоследствии они будут зафиксированы. Все операции записи, выполненные прерванными транзакциями, игнорируются. @@ -21,3 +30,5 @@ linked: - Работа с индексами. - Не модифицировать страницы, а создавать новые, вплоть до корня. - Хранить в индексе все версии +## Дополнительные материалы +- [MVCC in PostgreSQL-1. Isolation / Хабр](https://habr.com/ru/company/postgrespro/blog/467437/) \ No newline at end of file diff --git a/_inbox/Repeatable read.md b/_inbox/Repeatable read.md index 260167e9..da1f1e63 100644 --- a/_inbox/Repeatable read.md +++ b/_inbox/Repeatable read.md @@ -24,7 +24,7 @@ linked: Но возникает закономерный вопрос: что делать с ошибкой, ведь мы хотели выполнить транзакцию, которая свалилась с исключением. Самое простое, что можно сделать — это повторить выполнение второй транзакции с новыми данными. Если исключение возникнет опять, то повторить снова. Реализация: -- Блокировки. Чтение не блокирует запись, а запись не блокирует чтение. +- [Блокировки](Блокировки.md). Чтение не блокирует запись, а запись не блокирует чтение. - [MVCC](MVCC.md) Особенности