Тогда на втором терминале мы получим такой результат от команды DELETE:
DELETE 0
Чем объясняется такой результат? Он кажется нелогичным: ведь команда
SELECT, выполненная в этой же второй транзакции, показывала наличие стро-
ки, удовлетворяющей условию удаления.
Объяснение таково: поскольку вторая транзакция пока еще не видит измене-
ний, произведенных в первой транзакции, то команда DELETE выбирает для
удаления строку, описывающую модель Cessna 208 Caravan, однако эта строка
была заблокирована в первой транзакции командой UPDATE. Эта команда из-
менила значение атрибута range в этой строке. При завершении первой тран-
закции блокировка с этой строки снимается (со второй строки — тоже), и ко-
манда DELETE во второй транзакции получает возможность заблокировать эту
строку. При этом команда DELETE данную строку
перечитывает
и вновь вычис-
ляет условие WHERE применительно к ней. Однако теперь условие WHERE для
данной строки уже не выполняется, следовательно, эту строку удалять нельзя.
Конечно, в таблице есть теперь другая строка, для самолета Bombardier CRJ-200,
удовлетворяющая условию удаления, однако повторный поиск строк, удовле-
творяющих условию WHERE в команде DELETE, не производится. В результате
не удаляется ни одна строка. Таким образом, к сожалению, имеет место нару-
шение согласованности, которое можно объяснить деталями реализации СУБД.
Завершим вторую транзакцию:
Достарыңызбен бөлісу: