Выполнение транзакций в многопользовательских системах

  • Часть 1
  • | 2
  • | 3

Предположим, что в базе данных хранятся записи о наличии товаров на трех складах торгового предприятия (поля Название складаКоличество, шт.):

Склад 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 ]. Идеальной является такая организация работы, когда действия одного пользователя не видны другим пользователям, а выполняемые одновременно транзакции изолированы друг от друга.

Для решения этой задачи обычно используется механизм блокировки – если объект базы данных (таблица, страница или отдельная запись) используется некоторой транзакцией, доступ к этому объекту со стороны других транзакций запрещается полностью или ограничивается (блокируется). После завершения транзакции все заблокированные ею объекты становятся доступными другим транзакциям для выполнения любых операций.

предыдущаяследующая