Нет, хранимые процедуры не являются атомарными.
Псевдокод, который вы показываете выше, имеет состояние гонки. Первый цикл, проверяющий, есть ли у строки флаг, вернет ответ, но если вы не выполните чтение с блокировкой , другой параллельный сеанс может изменить флаг сразу после того, как ваша процедура прочитает строку.
Это эффект оптимистической блокировки . Строки не блокируются, пока вы не выполните оператор для их блокировки. Так что даже внутри транзакции у вас нет атомарной блокировки.
Атомарность, которую поддерживает MySQL, предназначена для фиксации транзакции. Транзакции являются атомарными в том смысле, что все изменения, сделанные во время транзакции, успешны, иначе все откатываются. Другие сеансы не могут увидеть вашу транзакцию в частично завершенном состоянии.
Re комментарии ниже:
Вы можете вызвать процедуру внутри транзакции из своего приложения:
START TRANSACTION;
CALL MyProcedure();
COMMIT;
Вы даже можете запустить и зафиксировать транзакцию (или несколько транзакций последовательно), явно в теле процедуры:
CREATE PROCEDURE MyProcedure()
BEGIN
START TRANSACTION;
...UPDATE, INSERT, DELETE, blah blah...
COMMIT;
END
Но сама процедура не запускает и не фиксирует транзакцию.