Казахстан |
Транзакции в базах данных
Проблемы параллельного доступа с использованием транзакций
При параллельном использовании транзакций могут возникать следующие проблемы:
- неповторяющееся чтение (non-repeatable read);
- "грязное" чтение (dirty read) - чтение данных, которые были записаны откатанной транзакцией ;
- потерянное обновление (lost update);
- фантомная вставка (phantom insert).
Рассмотрим ситуации, в которых возможно возникновение данных проблем.
Неповторяющееся чтение
Предположим, имеются две транзакции, открытые различными приложениями, в которых выполнены следующие SQL-операторы:
В транзакции 2 выбирается значение поля f2, затем в транзакции 1 изменяется значение поля f2. При повторной попытке выбора значения из поля f2 в транзакции 1 будет получен другой результат (рис. 7.1). Эта ситуация особенно неприемлема, когда данные считываются с целью их частичного изменения и обратной записи в базу данных.
"Грязное" чтение
Предположим, имеется две транзакции, открытые различными приложениями, в которых выполнены следующие SQL-операторы:
В транзакции 1 изменяется значение поля f1, а затем в транзакции 2 выбирается значение поля f2. После этого происходит откат транзакции 1. В результате значение, полученное второй транзакцией, будет отличаться от значения, хранимого в базе данных.
Потерянное обновление
Предположим, имеется две транзакции, открытые различными приложениями, в которых выполнены следующие SQL-операторы:
В транзакции 1 изменяется значение поля f1, а затем в транзакции 2 также изменяется значение этого поля. В результате изменение, выполненное первой транзакцией, будет потеряно.
Фантомная вставка
Предположим, имеется две транзакции, открытые различными приложениями, в которых выполнены следующие SQL-операторы:
В транзакции 2 выполняется SQL-оператор, использующий все значения поля f2. Затем в транзакции 1 выполняется вставка новой строки, приводящая к тому, что повторное выполнение SQL-оператора в транзакции 2 выдаст другой результат. Такая ситуация называется фантомной вставкой и является частным случаем неповторяющегося чтения. При этом, если выполняемый SQL-оператор выбирает не все значения поля f2, а только значение одной строки таблицы (используется предикат WHERE ), то выполнение оператора INSERT не приведет к ситуации фантомной вставки.