Как устранить состояние гонки во время транзакции БД - считайте количество строк из БД, рассчитайте ввод, затем вставьте значение в БД?
Сценарий: функция сохранения сначала считывает общее количество строк из таблицы в БД. На основе количества строк вычисляется уникальное входное значение. Это значение включается в строку, которая затем вставляется в ту же таблицу.
Проблема: два экземпляра одного и того же объекта выполняют функцию сохранения одновременно. Здесь "same time" - это время, которое требуется приложению для чтения и вставки строки в базу данных. Так, например,
Пользователь A нажимает кнопку сохранения >> Читает, что в таблице 3 строки >> Вычисляет f(3) как уникальное входное значение для новой строки >> Готовит новую строку для вставки в таблицу...
Пользователь B нажимает кнопку сохранения >> (поскольку пользователь A не вставил новую строку) Читает, что в таблице есть 3 строки >> Вычисляет f(3), которое НЕ является уникальным значением (ОШИБКА!) >> ...
Как мне исправить эту ситуацию? Я не могу изменить логику транзакции БД, поскольку, к сожалению, используется абстрактный уровень ORM. Однако я полностью контролирую код. Любое предложение будет очень полезным.
Я уже пытался поставить lock() вокруг функции сохранения, но это не помогает.
1 ответ
Я закончил тем, что использовал сгенерированный БД идентификатор (автоинкремент) для моих вычислений. Поскольку количество строк и идентификатор не были синхронизированы, скорректировали новый пользовательский идентификатор, добавив целое число в новую последовательность, чтобы она соответствовала старой последовательности.