Я очень смущен.
У меня есть транзакция на уровне изоляции ReadCommitted. Помимо прочего, я также обновляю в нем значение счетчика, что-то похожее на приведенное ниже:
Update tblCount set counter = counter + 1
Мое приложение является настольным приложением, и эта транзакция происходит довольно часто и одновременно. Недавно мы заметили ошибку, что иногда значение счетчика не обновляется или пропускается. Мы также вставляем одну запись в каждое обновление счетчика, поэтому мы уверены, что записи были вставлены, но каким-то образом счетчик не может обновиться. Это происходит один раз в 2000 одновременных транзакций.
Я серьезно сомневаюсь, что это аномалия потерянного обновления, с которой я сталкиваюсь, но если вы посмотрите на приведенную выше команду, она просто обновит счетчик с его собственного значения: если я запустил транзакцию и транзакция достигла этого утверждения, она должна заблокировали ряд. Это не должно вызывать потерянное обновление, но это происходит как-то.
Дело в том, что эта команда обновления работает в двух частях? Как сначала он читает значение счетчика (во время которого он не получает эксклюзивную блокировку), а затем записывает новое вычисленное значение (когда он получает эксклюзивную блокировку)?
Пожалуйста, помогите, я действительно запутался.