Учебно-практическое пособие москва 2017 ббк


BEGIN; BEGIN SELECT * FROM aircrafts_tmp WHERE range



Pdf көрінісі
бет209/243
Дата21.07.2022
өлшемі3,05 Mb.
#147663
түріУчебно-практическое пособие
1   ...   205   206   207   208   209   210   211   212   ...   243
Байланысты:
Язык SQL. Базовый курс

BEGIN;
BEGIN
SELECT * FROM aircrafts_tmp WHERE range < 2000;
aircraft_code |
model
| range
---------------+--------------------+-------
CN1
| Cessna 208 Caravan | 1200
(1 строка)
UPDATE aircrafts_tmp
SET range = 2100
WHERE aircraft_code = 'CN1';
UPDATE 1
UPDATE aircrafts_tmp
SET range = 1900
WHERE aircraft_code = 'CR2';
UPDATE 1
На втором терминале начнем вторую транзакцию, которая и будет пытаться
удалить строки, у которых значение атрибута range меньше 2000.
BEGIN;
BEGIN
SELECT * FROM aircrafts_tmp WHERE range < 2000;
aircraft_code |
model
| range
---------------+--------------------+-------
CN1
| Cessna 208 Caravan | 1200
(1 строка)
DELETE FROM aircrafts_tmp WHERE range < 2000;
Введя команду DELETE, мы видим, что она не завершается, а ожидает, когда со
строки, подлежащей удалению, будет снята блокировка. Блокировка, установ-
ленная командой UPDATE в первой транзакции, снимается только при завер-
шении транзакции, а завершение может иметь два исхода: фиксацию измене-
ний с помощью команды COMMIT (или END) или отмену изменений с помощью
команды ROLLBACK.
Давайте зафиксируем изменения, выполненные первой транзакцией. На пер-
вом терминале сделаем так:
COMMIT;
COMMIT
219


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


Достарыңызбен бөлісу:
1   ...   205   206   207   208   209   210   211   212   ...   243




©engime.org 2024
әкімшілігінің қараңыз

    Басты бет