Задать вопрос
@Narts

Правильно ли я понял суть транзакций в веб приложениях?

привет! есть функционал перевода средств от юзера к юзеру. при каждом переводе выполняется ряд проверок (есть ли баланс; может ли юзер переводить средства и тд). то есть перед update-запросом идет 4 select запроса с проверками.
в общем виде алгоритм такой:
1. select + проверка
2. select + проверка
3. select + проверка
4. если до этого пункта дошли, значит по проверкам все ок, делаем update запрос для перевода средств

но чтобы не было race condition, это все оборачивается в транзакцию и меняется порядок запросов:
1. update
2. select
3. select
4. select
5. проверяем селекты, если все ок, то делаем commit, в ином случае rollback

правильно ли я понял суть транзакций?
  • Вопрос задан
  • 178 просмотров
Подписаться 2 Простой Комментировать
Пригласить эксперта
Ответы на вопрос 2
ipatiev
@ipatiev
Потомок старинного рода Ипатьевых-Колотитьевых
Все, абсолютно все люди путают транзакции с блокировками. Это какая-то массовая галлюцинация.
Хотя там все просто, как 2х2
Транзакции используются для консистентности. Чтобы когда выполняется больше одного запроса, изменяющего данные, то были выполнены либо все, либо ни одного.
А чтобы не было race condition используются блокировки.

Делаете SELECT FOR UPDATE, который блокирует строку, чтобы больше никто из нее не мог читать. Любой процесс, который захочет прочесть это же значение, будет стоять и ждать.
Дальше вы делаете свои проверки, и потом сам апдейт, который отпустит блокировку.
Процесс, который ждал своей очереди, получит уже измененное значение, и проверка не пройдет.
Ответ написан
Комментировать
ThunderCat
@ThunderCat Куратор тега MySQL
{PHP, MySql, HTML, JS, CSS} developer
Транзакция это не логика, транзакция это защита от ситуации "что-то пошло не так". Логика проверок отдельно, внесение данных в транзакции отдельно. Если транзакция не прошла - откатываем все изменения внесенные до ошибки. То есть транзакция защищает целостность данных, где например счет одного клиента уменьшен, а другого не пополнен, например какой-то форенкей отсутствует. Нельзя строить логику проверки на транзакциях, она не для этого.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы