Навигация
|
Свойства ACID и транзакции баз данныхСвойства ACID и транзакции баз данных
В реляционных базах данных логическая операция называется - транзакцией
Транзакция может состоять из нескольких операций (create, read, update, delete – CRUD)
Свойства ACID
Атомарность:
Все или ничего, если любая часть транзакции завершается неудачно, то неудачно завершается вся транзакция
Согласованность (Консистентность):
Транзакция переводит базу данных из одного непротиворечивого состояния в другое непротиворечивое состояние
Т.е. все требования уникальности и требования были соблюдены для каждой совершенной транзакции:
Требования по ключам (primary и foreign keys), уникальности, типам данных, триггерам успешно пройдены
Изолированность:
Во время выполнения транзакции, параллельные ей транзакции не должны оказывать влияние на ее результат
Стандарт SQL определяет 4 уровня изолированности
Уровни (кроме SERIALIZABLE) подвержены аномалиям (отличия см. в документации используемой БД):
Обычно, уровень изоляции БД - READ_COMMITTED
СУБД Уровень по умолчанию
Примечание! Далее будут примеры, в которых у БД PostgreSQL уровни изоляции по другому меняют логику аномалий!
Чтож, посмотрим, как ведет себя postgreSQL на разных уровнях изоляции, попробуем подловить аномалии
Грязное чтение
Происходит когда транзакция может прочитать незаконченные изменения другой выполняемой транзакции
Происходит ввиду того, что нет предотвращающих чтение блокировок это
Неповторяющееся чтение
Происходит когда повторные чтения в одной транзакции дают разные результаты ввиду действий параллельных транзакций
Например параллельная транзакция обновила запись, которую читает первая транзакция
Примеры ниже показаны на PostgreSQL
Создадим базу и таблицу для тестов:
Прочтите до выполнения текст всех трех транзакций
Транзакция 1 (выполняется параллельно Транзакии 2):
Транзакция 2, версия 1:
Результат 1, 1, 21, 21, При параллельной работе SELECT в транзакции 2 не ожидает окончания транзакции 1
Вернем значение назад:
Транзакция 2, версия 1:
Результат 1, 1, 1 и 21, При параллельной работе SELECT в транзакции 2 не ожидает окончания транзакции 1
Фантомное чтение (PostgreSQL пытается исключить аномалию)
Когда одна транзакция пытается прочитать строку, которая еще не существует в начале транзакции
Однако строка вставляется другой транзакцией и успешно заканчивается, прежде чем закончится первая транзакция
Если первая транзакция снова выполнит поиск этой строки, то обнаружит ее неожиданное появление
Эта новая строка называется - фантомной строкой
Вернем значение назад:
Прочтите до выполнения текст всех трех транзакций
Транзакция 1 (выполняется параллельно Транзакии 2):
Транзакция 2, версия 1
Результат 1, 1, 1 и 21, При параллельной работе SELECT в транзакции 2 не ожидает окончания транзакции 1
Транзакция 2, версия 1
Результат 1, 1, 1 и 21, При параллельной работе SELECT в транзакции 2 не ожидает окончания транзакции 1
Долговечность:
Результат зафиксированных (успешно выполненных) транзакций сохраняется даже в случае аварии (сбоя) сервера
Комментарии пользователей Эту новость ещё не комментировалиНаписать комментарий Анонимам нельзя оставоять комментарии, зарегистрируйтесь! |
Контакты Группа ВК | Код обмена баннерами | Видео к IT статьям на YoutubeВидео на другие темы Смотреть | |||
Мои друзья: | © Snakeproject.ru создан в 2013 году.При копировании материала с сайта - оставьте ссылку.Весь материал на сайте носит ознакомительный характер,за его использование другими людьми, автор ответственности не несет. |
||||
Поддержать автора и проект
|