Считается, что передача обработки элементарных операций нескольких транзакций происходит в момент освобождения процессора (например, при записи или чтения данных из внешней памяти).
Две транзакции по очереди записывают некоторые данные в одну и ту же строку и фиксируют изменения.
| Время | Транзакция A | Транзакция B |
| Чтение
| --- |
| Запись
| --- |
| --- | Чтение
|
| --- | Запись
|
| COMMIT | --- |
| --- | COMMIT |
| Потеря результата обновления |
Результат. После окончания обеих транзакций, строка
содержит значение
, занесенное более поздней транзакцией B. Транзакция A ничего не знает о существовании транзакции B, и ожидает в строке
значение
. Таким образом, транзакция A потеряла результаты своей работы.
12. Проблема незафиксированной зависимости (чтение "грязных" данных)
Транзакция B изменяет данные в строке. После этого транзакция A считывает измененные данные и работает с ними. Транзакция B откатывается и восстанавливает старые данные.
| Время | Транзакция A | Транзакция B |
| --- | Чтение
|
| --- | Запись
|
| Чтение
| --- |
| Работа с прочитанными данными
| --- |
| --- | Rollback tran
|
| COMMIT | --- |
| Работа с "грязными" данными |
Результат. Транзакция A в своей работе использовала данные, которых фактически не было в БД. Так как после отката транзакции B, восстановит данные, как если бы она вообще никогда не выполнялась. Таким образом, результаты работы транзакции A некорректны, т.к. она работала с данными, отсутствовавшими в БД.
Неповторяемое считывание
Транзакция A дважды читает одну и ту же строку. Между этими чтениями вклинивается транзакция B, которая изменяет значения в строке.
| Время | Транзакция A | Транзакция B |
| Чтение
| --- |
| --- | Чтение
|
| --- | Запись
|
| --- | COMMIT |
| Повторное чтение
| --- |
| COMMIT | --- |
| Неповторяемое считывание |
Результат. Транзакция A не знает о существовании транзакции B, и, т.к. сама не меняет значение в строке, то ожидает, что после повторного чтения значение будет тем же самым. Транзакция A работает с данными, которые, с точки зрения транзакции A, самопроизвольно изменяются.
Фиктивные элементы (фантомы)
Транзакция A дважды выполняет выборку строк с одним и тем же условием. Между выборками вклинивается транзакция B, которая добавляет новую строку, удовлетворяющую условию отбора.
| Время | Транзакция A | Транзакция B |
| S-блокировка строк, удовлетворяющих условию . (Заблокировано n строк)
| --- |
| Выборка строк, удовлетворяющих условию . (Отобрано n строк)
| --- |
| --- | Вставка новой строки, удовлетворяющей условию .
|
| --- | COMMIT |
| S-блокировка строк, удовлетворяющих условию . (Заблокировано n+1 строка)
| --- |
| Выборка строк, удовлетворяющих условию . (Отобрано n+1 строк)
| --- |
| COMMIT | --- |
| Появились строки, которых раньше не было |
Результат. Блокировка на уровне строк не решила проблему появления фиктивных элементов.
. (Заблокировано n строк)