Сеансы, транзакции и блокировки – это понятия, связанные с задачей обеспечения эффективной и безопасной работы любой многопользовательской СУБД. Сеансы и транзакции позволяют структурировать работу пользователей. Блокировки – это основной механизм поддержания целостности данных при параллельном выполнении транзакций.
При совместной работе нескольких пользователей СУБД должна гарантировать, что пользователи не будут мешать друг другу. При параллельном выполнении транзакций могут возникать следующие проблемы.
Пример. На приеме заказов работают два оператора. Первый принял заказ на 30 мониторов. Когда он запрашивал склад, там числилось 40 мониторов, и он оформил продажу 30 мониторов из 40.
Параллельно с ним второй оператор принял заказ на 20 мониторов и, запросив склад, тоже получил 40. Закончив работу с заказом, он выполнил команду UPDATE и занес 20 как остаток мониторов.
После этого закончил работу с заказом первый оператор, который выполнил команду UPDATE и занес 10 как остаток мониторов.
В итоге они продали 50 мониторов из имеющихся 40, а на складе числится еще 10 мониторов. БД находится в несогласованном состоянии, а у фирмы возникли проблемы.
Первый оператор ввел заказ на 30 мониторов, но клиент захотел выяснить некоторые детали. Приложение первого оператора изменило остаток мониторов на складе на 10. В это время второй оператор пытается принять заказ от своего клиента на 20 мониторов, но его приложение показывает, что на складе всего 10 мониторов, и оператор вынужден отказать клиенту.
В этот момент клиент первого оператора принимает решение не покупать мониторы, и приложение выполняет откат транзакции (на складе снова 40 мониторов). Потерян заказчик, но еще хуже, если бы клиент второго оператора согласился на 10 оставшихся мониторов. Приложение второго оператора занесло бы ноль оставшихся мониторов, а после этого приложение первого оператора снова записало бы исходные 40 мониторов, хотя 10 их них уже проданы.
Пример строк-призраков. Администратор поручил секретарю отчет за месяц в двух видах (подробном и укрупненном). Когда приложение начало формировать первый отчет, оператор принял еще один заказ и к моменту формирования второго отчета в БД появились новые сведения. Приложение выполнило два одинаковых запроса и получило два разных результата. БД находится в согласованном состоянии, но приложение работает некорректно.
Захваты объектов на чтение несколькими транзакциями совместимы, захват объекта одной транзакцией на чтение не совместим с захватом другой транзакцией этого объекта на запись, захваты одного объекта разными транзакциями на запись не совместимы.