Целостность данных при одновременной работе: транзакции, блокировки, взаимоблокировки. Любимая тема senior-собеседований.
Ниже — 2 вопроса с разбором. Всего по этой теме
7 вопросов, и в тренажёре они задаются вперемешку
и без подсказок: там проверяется, что тема уложилась, а не что её
приятно читать.
Что произойдёт, если внутри транзакции возникнет исключение и его перехватят Попыткой, но не вызовут ОтменитьТранзакцию?
Транзакция останется незавершённой, и при попытке записи дальше платформа выдаст ошибку о некорректном завершении — верно
Платформа сама откатит транзакцию при выходе из Попытки, и выполнение продолжится штатно
Данные запишутся: исключение перехвачено, значит транзакция считается успешно завершённой
Ничего не изменится: Попытка изолирует транзакцию от ошибки и оставляет её ровно в том состоянии, в котором она была
Перехват исключения не завершает транзакцию. Она остаётся открытой в состоянии «только для отмены», и любая последующая запись даст ошибку. Поэтому в блоке Исключение обязательно вызывают ОтменитьТранзакцию, а уже потом обрабатывают ошибку.
Зачем нужна управляемая блокировка, если проверка остатка уже выполнена запросом?
Между проверкой и записью другой сеанс может списать тот же товар, и оба проведения увидят достаточный остаток — верно
Запрос не умеет читать виртуальные таблицы остатков, пока данные не заблокированы явно
Управляемая блокировка ускоряет чтение остатков, потому что платформа кеширует результат запроса и не обращается к базе повторно внутри транзакции
Без неё платформа откажется записывать движения в регистр накопления и вернёт ошибку
Классическая гонка: два проведения одновременно читают остаток 10, каждому нужно 7, оба видят «хватает» и оба списывают. Итог — минус на складе. Блокировка не даёт второму сеансу прочитать данные, пока первый не завершит транзакцию.
О чём ещё спрашивают по этой теме
Чем управляемые блокировки отличаются от автоматических?