Контрольные вопросы и задания
1. По умолчанию каждая SQL-команда, выполняемая в среде psql, образует от-
дельную транзакцию с уровнем изоляции Read Committed. Поэтому в тех экс-
периментах, когда одна из транзакций состоит только из единственной SQL-
команды, можно не выполнять команды BEGIN и END. Конечно, если каждая из
параллельных транзакций состоит из единственной SQL-команды, то хотя бы
для одной из транзакций придется все же выполнить и команду BEGIN, иначе
эксперимент не получится.
В тексте главы были приведены примеры транзакций, в которых рассматрива-
лись команды SELECT ... FOR UPDATE и LOCK TABLE. Попробуйте повторить
эти эксперименты с учетом описанного поведения PostgreSQL.
2. Транзакции, работающие на уровне изоляции Read Committed, видят только
свои собственные обновления и обновления, зафиксированные параллельными
транзакциями. При этом нужно учитывать, что иногда могут возникать ситу-
ации, которые на первый взгляд кажутся парадоксальными, но на самом деле
все происходит в строгом соответствии с этим принципом.
Воспользуемся таблицей «Самолеты» (aircrafts) или ее копией. Предполо-
жим, что мы решили удалить из таблицы те модели, дальность полета которых
менее 2 000 км. В таблице представлена одна такая модель — Cessna 208 Caravan,
имеющая дальность полета 1 200 км. Для выполнения удаления мы организова-
ли транзакцию. Однако параллельная транзакция, которая, причем, началась
раньше, успела обновить таблицу таким образом, что дальность полета самоле-
та Cessna 208 Caravan стала составлять 2 100 км, а вот для самолета Bombardier
CRJ-200 она, напротив, уменьшилась до 1 900 км. Таким образом, в результате
выполнения операций обновления в таблице по-прежнему присутствует стро-
ка, удовлетворяющая первоначальному условию, т. е. значение атрибута range
у которой меньше 2000.
Наша задача: проверить, будет ли в результате выполнения двух транзакций
удалена какая-либо строка из таблицы.
На первом терминале начнем транзакцию, при этом уровень изоляции Read
Committed в команде указывать не будем, т. к. он принят по умолчанию:
Достарыңызбен бөлісу: |