Являются ли хранимые процедуры MySql атомарными? - PullRequest
0 голосов
/ 29 июня 2018

Как видно из названия, хранимые процедуры в MySQL атомарны? то есть что-то вроде

for (..)
  <check_if_row_has_flag>
for (..)
  <update_row>

работать атомарно?

Интересно, что я не смог найти много об этом в Google, кроме одной ветки форума 2009 года.

1 Ответ

0 голосов
/ 29 июня 2018

Нет, хранимые процедуры не являются атомарными.

Псевдокод, который вы показываете выше, имеет состояние гонки. Первый цикл, проверяющий, есть ли у строки флаг, вернет ответ, но если вы не выполните чтение с блокировкой , другой параллельный сеанс может изменить флаг сразу после того, как ваша процедура прочитает строку.

Это эффект оптимистической блокировки . Строки не блокируются, пока вы не выполните оператор для их блокировки. Так что даже внутри транзакции у вас нет атомарной блокировки.

Атомарность, которую поддерживает MySQL, предназначена для фиксации транзакции. Транзакции являются атомарными в том смысле, что все изменения, сделанные во время транзакции, успешны, иначе все откатываются. Другие сеансы не могут увидеть вашу транзакцию в частично завершенном состоянии.


Re комментарии ниже:

Вы можете вызвать процедуру внутри транзакции из своего приложения:

START TRANSACTION;
CALL MyProcedure();
COMMIT;

Вы даже можете запустить и зафиксировать транзакцию (или несколько транзакций последовательно), явно в теле процедуры:

CREATE PROCEDURE MyProcedure()
BEGIN
    START TRANSACTION;
    ...UPDATE, INSERT, DELETE, blah blah...
    COMMIT;
END 

Но сама процедура не запускает и не фиксирует транзакцию.

...