Я использую транзакции для управления данными в нескольких таблицах MySQL InnoDB в достаточно сложном веб-приложении. Вкратце, данная транзакция работает следующим образом:
- Data is read from a row in a "user_point_totals" table
- Various machinations calculate what the user's new point total should be
- A new entry is created in the "user_point_totals" table reflecting the updated total
Предположим, что пользователь A выполняет какое-то действие, имеющее разветвления, связанные с баллами, выполняется шаг 1, этот поток выполнения считывает общее количество баллов пользователя в память, и приложение начинает вычислять новую сумму. Тем временем пользователь B выполняет действие, которое влияет на общее количество баллов пользователя A, и начинается другая транзакция; однако первая транзакция еще не завершена, поэтому второй поток получает то же общее значение баллов в качестве начальной точки, что и первая транзакция (из той же строки таблицы). Впоследствии транзакция 1 завершается и создает новую общую сумму баллов пользователя с учетом того, каким должно быть новое значение, а вскоре после этого завершается транзакция 2 и также создает новую строку для общей суммы баллов пользователя. Однако общая сумма баллов второй транзакции теперь неверна, так как не учитывает новую общую сумму, созданную транзакцией 1.
Мои вопросы:
- Is this scenario impossible due to the atomic nature of transactions, which I apparently don't understand as well as I should?
- If not, how does one ensure that data integrity exists in these sorts of situations?
Спасибо за внимание!