2.2 KiB
aliases | tags | date | zero-link | parents | linked | |||||
---|---|---|---|---|---|---|---|---|---|---|
|
|
|
|
Реализация может отличаться в зависимости от СУБД.
У каждой транзакции есть идентификатор. У каждой записи появляется мета-информация updated_by(tx_id) и deleted_by(tx_id). На основе этой информации можно понять видит ли транзакция эту запись или нет.
Например:
- deleted_by(n+1). Транзакция n эту запись видит.
- deleted_by(n-4). Транзакция n эту запись не видит.
В начале каждой транзакции база данных создает список всех остальных выполняемых на текущий момент транзакций (но еще не зафиксированных или прерванных). Все выполненные этими транзакциями изменения игнорируются, даже если впоследствии они будут зафиксированы.
Все операции записи, выполненные прерванными транзакциями, игнорируются.
Все операции записи, выполненные транзакциями с более поздним идентификатором транзакции (то есть начавшиеся после запуска текущей транзакции), игнорируются независимо от того, были ли они зафиксированы.
Результаты всех остальных операций записи видны запросам приложения.
Проблемы:
- Работа с индексами.
- Не модифицировать страницы, а создавать новые, вплоть до корня.
- Хранить в индексе все версии