BEGIN TRANSACTION ISOLATION LEVEL SERIALIZABLE; BEGIN
В команде обновления строки будем использовать предложение RETURNING. По-
скольку значение поля num не изменяется, то будет видно, какая строка была обнов-
лена. Это особенно пригодится во второй транзакции.
UPDATE modes SET mode = 'HIGH' WHERE mode = 'LOW' RETURNING *; num | mode
-----+------
1 | HIGH
(1 строка)
UPDATE 1
На втором терминале тоже начнем транзакцию и обновим другую строку из тех двух
строк, которые были показаны выше.
270
9.5. Уровень изоляции Serializable BEGIN TRANSACTION ISOLATION LEVEL SERIALIZABLE; BEGIN
UPDATE modes SET mode = 'LOW' WHERE mode = 'HIGH' RETURNING *; num | mode
-----+------
2 | LOW
(1 строка)
UPDATE 1
Изменение, произведенное в первой транзакции, вторая транзакция не видит, по-
скольку на уровне изоляции Serializable каждая транзакция работает с тем снимком
базы данных, который был сделан непосредственно перед выполнением ее перво-
го оператора. Поэтому обновляется только одна строка, та, в которой значение поля
mode было равно HIGH изначально.
Обратите внимание, что обе команды UPDATE были выполнены, ни одна из них не
ожидает завершения другой транзакции.
Посмотрим, что получилось в первой транзакции:
SELECT * FROM modes; num | mode
-----+------
2 | HIGH
1 | HIGH
(2 строки)
А во второй транзакции:
SELECT * FROM modes; num | mode
-----+------
1 | LOW
2 | LOW
(2 строки)
271
Глава 9. Транзакции Заканчиваем эксперимент. Сначала завершим транзакцию на первом терминале: