Files
homework/dmedvedev/10.2.Blocks.sql
T
2026-06-26 01:56:44 +05:00

33 lines
3.8 KiB
SQL
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
--Задание 1. Чтение и чтение
--Сформулируй, что делают две одновременные сессии, каждая выполняет SELECT * FROM users WHERE id = 1;.
--Эти две сессии из делают следующее: запрашивают данные из таблицы users, фильтруют по id и далее выводят все столбцы.
--Почему оба запроса могут выполниться сразу, без ожидания?
-- Потому что этим сессиям нечего ожидать, они берут данные и читают их, здесь нет никаких действий по изменению данных.
--Задание 2. Два UPDATE одного пользователя
--Опиши, что будет делать вторая сессия, пока первая транзакция не закончилась.
--Вторая сессия будет ждать пока первая транзакция завершится.
--Почему нельзя разрешить обоим UPDATE пройти одновременно?
--В таком случае не будет ясно какой именно будет конечный результат, нельзя допускать эту коллизию, все должно быть последовательно.
--Какой email в итоге останется у Alice и почему порядок COMMIT важен?
--В данном случае в конечном счете у Алисы будет второй имэйл, либо получит ошибку (если ее откатят).
--Задание 3. SELECT ... FOR UPDATE
--что будет с SELECT * FROM users WHERE id = 2;
--просто прочитает данные. Боб лишь заблокирован для изменений.
--что будет с UPDATE users SET country = 'FR' WHERE id = 2;.
--В таком случае БД увидит конфликт и одну из транзакций откатит с ошибкой , а вторую пропустит дальше.
--Задание 4. Дедлок на двух пользователях
--Объясни своими словами, почему возникает дедлок и что сделает база с одной из транзакций.
--Потому что обе транзакции держат пользователей заблокированными. БД решает конфликт и отменяют одну из них.
--Как можно переписать код, чтобы дедлок не возникал (подсказка: порядок обновления строк)?
--Код надо писать так чтобы не было такого пересечения, в данном случае пересекаются id товаров, поэтому можно переписать запрос таким образом, что было последовательность запросов соответствовала возрастающему id.
--Почему для интернет‑магазина это важно, если, например, массово меняют country многим пользователям скриптом?
--потому что в момент замены БД может заблокировать всех пользователей, пока не завершится транзакция, а это может быть миллион строк, соответственно, другая сессия может обратиться к одному из пользователей и получится дэдлок. Поэтому если и обновлять, то лучше партиями и с увеличением id.