Предположим, что в базе данных хранятся записи о наличии товаров на трех складах торгового предприятия (поля Название склада – Количество, шт.):
|
Склад 1 |
50 |
|
Склад 2 |
100 |
|
Склад 3 |
200 |
Первая транзакция подсчитывает суммарное количество товаров на всех складах предприятия, последовательно считывая из БД записи с данными. Вторая транзакция предусматривает перемещение 100 штук товара с третьего склада на первый. Очевидно, что эта транзакция не может изменить суммарное количество товаров.
Допустим, что действия в рамках транзакций выполняются в следующем порядке:
1. Первая транзакция читает первую запись. Количество товаров – 50 штук, следовательно, их суммарное количество также пока равно 50.
2. Вторая транзакция читает третью запись. Количество товаров – 200 штук.
3. Первая транзакция читает вторую запись. Количество товаров – 100 штук, сумма равна 150.
4. Вторая транзакция вычитает 100 штук товара из количества, указанного в третьей записи. Обновленное значение количества товаров в третьей записи составляет 100 штук.
5. Первая транзакция читает третью запись. Количество товаров – 100 штук, сумма равна 250.
6. Вторая транзакция читает первую запись и добавляет к хранящемуся в ней количеству товаров (50 штук) 100 поступивших единиц. Обновленное значение количества товаров в первой записи составляет 150 штук.
В результате несогласованного анализа первая транзакция неправильно вычислила суммарное количество товаров. Оно составило 250 штук при фактическом значении 350 штук.
Рассмотренные примеры свидетельствуют о том, что СУБД должна не только восстанавливать согласованное состояние базы данных после сбоев, но и обеспечивать корректную параллельную работу всех пользователей над одними и теми же данными [ 4 ]. Идеальной является такая организация работы, когда действия одного пользователя не видны другим пользователям, а выполняемые одновременно транзакции изолированы друг от друга.
Для решения этой задачи обычно используется механизм блокировки – если объект базы данных (таблица, страница или отдельная запись) используется некоторой транзакцией, доступ к этому объекту со стороны других транзакций запрещается полностью или ограничивается (блокируется). После завершения транзакции все заблокированные ею объекты становятся доступными другим транзакциям для выполнения любых операций.
предыдущаяследующая