added file with blocks
This commit is contained in:
@@ -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.
|
||||
Reference in New Issue
Block a user