Всё верно. Классика race condition.
Изначальный код в первом сообщении, где select уже в транзакции, но не захватывает эксклюзивную блокировку, тоже подвержен этому же race condition.
Третий раз написать, что для исключения состояния гонки в этом коде необходимо использовать select for update внутри транзакции? Только в этом случае СУБД нормально сериализует происходящее.
Этот кусок кода примечателен следующими штуками:
- речь о mysql, что видно по стилю оформления имён объектов в БД
- выбирается любой bank.status=1, а не какой-то конкретный. Значит при конкурентном доступе для второй транзакции может найтись другая подходящая строка после фиксации первой транзакции. В принципе, это условие даже можно сериализовать иным образом чем select for update, но эффективно получится то же самое при большем объёме кода и нескольких бесполезных транзакциях.
gheka пишет:// Проверим нажал ли пользователь кнопку
Проверка реализована некорректно, к слову. submit формы может происходить без отправки input type=submit. Это допустимое поведение клиента.
|