Московский государственный университет имени М.В.Ломоносова
Опубликован: 05.01.2004 | Доступ: свободный | Студентов: 9476 / 1246 | Оценка: 4.04 / 3.84 | Длительность: 10:03:00
ISBN: 978-5-94774-539-9
Лекция 7:

Транзакции в базах данных

< Лекция 6 || Лекция 7: 1234 || Лекция 8 >

Проблемы параллельного доступа с использованием транзакций

При параллельном использовании транзакций могут возникать следующие проблемы:

  • неповторяющееся чтение (non-repeatable read);
  • "грязное" чтение (dirty read) - чтение данных, которые были записаны откатанной транзакцией ;
  • потерянное обновление (lost update);
  • фантомная вставка (phantom insert).

Рассмотрим ситуации, в которых возможно возникновение данных проблем.

Неповторяющееся чтение

Предположим, имеются две транзакции, открытые различными приложениями, в которых выполнены следующие SQL-операторы:

Транзакция 1 Транзакция 2
SELECT f2 FROM tbl1 WHERE f1=1;
UPDATE tbl1 SET f2=f2+1 WHERE f1=1;
 
SELECT f2 FROM tbl1 WHERE f1=1;
 
SELECT f2 FROM tbl1 WHERE f1=1;

В транзакции 2 выбирается значение поля f2, затем в транзакции 1 изменяется значение поля f2. При повторной попытке выбора значения из поля f2 в транзакции 1 будет получен другой результат (рис. 7.1). Эта ситуация особенно неприемлема, когда данные считываются с целью их частичного изменения и обратной записи в базу данных.

Неповторяющееся чтение

Рис. 7.1. Неповторяющееся чтение

"Грязное" чтение

Предположим, имеется две транзакции, открытые различными приложениями, в которых выполнены следующие SQL-операторы:

Транзакция 1 Транзакция 2
SELECT f2 FROM tbl1 WHERE f1=1;
UPDATE tbl1 SET f2=f2+1 WHERE f1=1;
 
ROLLBACK WORK;
 
 
SELECT f2 FROM tbl1 WHERE f1=1;
 

В транзакции 1 изменяется значение поля f1, а затем в транзакции 2 выбирается значение поля f2. После этого происходит откат транзакции 1. В результате значение, полученное второй транзакцией, будет отличаться от значения, хранимого в базе данных.

Потерянное обновление

Предположим, имеется две транзакции, открытые различными приложениями, в которых выполнены следующие SQL-операторы:

Транзакция 1 Транзакция 2
SELECT f2 FROM tbl1 WHERE f1=1;
UPDATE tbl1 SET f2=20 WHERE f1=1;
 
SELECT f2 FROM tbl1 WHERE f1=1;
 
UPDATE tbl1 SET f2=25 WHERE f1=1;

В транзакции 1 изменяется значение поля f1, а затем в транзакции 2 также изменяется значение этого поля. В результате изменение, выполненное первой транзакцией, будет потеряно.

Фантомная вставка

Предположим, имеется две транзакции, открытые различными приложениями, в которых выполнены следующие SQL-операторы:

Транзакция 1 Транзакция 2
 
INSERT INTO tbl1 (f1,f2) VALUES (15,20);
 
SELECT SUM(f2) FROM tbl1;
 
SELECT SUM(f2) FROM tbl1;

В транзакции 2 выполняется SQL-оператор, использующий все значения поля f2. Затем в транзакции 1 выполняется вставка новой строки, приводящая к тому, что повторное выполнение SQL-оператора в транзакции 2 выдаст другой результат. Такая ситуация называется фантомной вставкой и является частным случаем неповторяющегося чтения. При этом, если выполняемый SQL-оператор выбирает не все значения поля f2, а только значение одной строки таблицы (используется предикат WHERE ), то выполнение оператора INSERT не приведет к ситуации фантомной вставки.

< Лекция 6 || Лекция 7: 1234 || Лекция 8 >