homework, pet project DE Dmitry_Medvedev #1

Open
dmitry_medvedev wants to merge 264 commits from md_branch into main
Showing only changes of commit 7b7930d136 - Show all commits
+33
View File
@@ -0,0 +1,33 @@
--Задание 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.