Sobes.tech
Назад к вопросам
Senior
3

Какой побочный эффект возникает при выполнении кода BEGIN; SET TRANSACTION ISOLATION LEVEL READ COMMITTED; START TRANSACTION; SELECT progress INTO @current_progress FROM courses WHERE course_id = 101; SET @current_progress = @current_progress + 60; UPDATE courses SET progress = @current_progress WHERE course_id = 101; COMMIT; END; BEGIN; SET TRANSACTION ISOLATION LEVEL READ COMMITTED; START TRANSACTION; SELECT progress INTO @current_progress FROM courses WHERE course_id = 101; SET @current_progress = @current_progress + 40; UPDATE courses SET progress = @current_progress WHERE course_id = 101; COMMIT; END;

Компании, где спрашивали
СБК ПАРУС

Ответ от нейросети

sobes.tech AI

В приведённом коде два параллельных транзакционных блока, которые читают и обновляют поле progress в таблице courses для одного и того же course_id = 101.

Поскольку уровень изоляции установлен в READ COMMITTED, возможна ситуация гонки (race condition): обе транзакции читают одно и то же значение progress, затем увеличивают его на 60 и 40 соответственно, и записывают обратно.

Побочный эффект — потеря обновления (lost update). Например, если изначально progress = 0, то обе транзакции прочитают 0, первая прибавит 60 и запишет 60, вторая прибавит 40 и запишет 40, перезаписав результат первой. В итоге итоговое значение будет 40 вместо ожидаемых 100.

Чтобы избежать этого, нужно использовать более строгий уровень изоляции (например, SERIALIZABLE) или применять механизмы блокировок/оптимистической блокировки.