Действительно ли условия гонки имеют значение, если вы сначала попробуете обновление, а затем вставку?
Допустим, у вас есть два потока, которые хотят установить значение для ключа ключ :
Тема 1: значение = 1
Поток 2: значение = 2
Пример сценария состояния гонки
- ключ не определен
- Тема 1 завершается с ошибкой
- Тема 2 завершается с ошибкой
- Ровно один из потока 1 или потока 2 успешно выполняет вставку. Например. нить 1
Другой поток завершается с ошибкой со вставкой (с ошибкой дублирующий ключ) - поток 2.
- Результат: «Первый» из двух протекторов, который нужно вставить, определяет значение.
- Требуемый результат: последний из 2 потоков для записи данных (обновление или вставка) должен решить значение
Но; в многопоточной среде планировщик ОС определяет порядок выполнения потока - в приведенном выше сценарии, где мы имеем это условие гонки, именно ОС определила последовательность выполнения. Т.е. неправильно говорить, что «поток 1» или «поток 2» был «первым» с точки зрения системы.
Когда время выполнения так близко для потока 1 и потока 2, результат условия гонки не имеет значения. Единственное требование должно состоять в том, чтобы один из потоков определял результирующее значение.
Для реализации: Если обновление, сопровождаемое вставкой, приводит к ошибке «дубликат ключа», это следует рассматривать как успех.
Кроме того, конечно, никогда не следует предполагать, что значение в базе данных совпадает со значением, которое вы написали последним.