Потерянная ошибка обновления в команде обновления сервера Sql - PullRequest
2 голосов
/ 27 января 2010

Я очень смущен.

У меня есть транзакция на уровне изоляции ReadCommitted. Помимо прочего, я также обновляю в нем значение счетчика, что-то похожее на приведенное ниже:

Update tblCount set counter = counter + 1

Мое приложение является настольным приложением, и эта транзакция происходит довольно часто и одновременно. Недавно мы заметили ошибку, что иногда значение счетчика не обновляется или пропускается. Мы также вставляем одну запись в каждое обновление счетчика, поэтому мы уверены, что записи были вставлены, но каким-то образом счетчик не может обновиться. Это происходит один раз в 2000 одновременных транзакций.

Я серьезно сомневаюсь, что это аномалия потерянного обновления, с которой я сталкиваюсь, но если вы посмотрите на приведенную выше команду, она просто обновит счетчик с его собственного значения: если я запустил транзакцию и транзакция достигла этого утверждения, она должна заблокировали ряд. Это не должно вызывать потерянное обновление, но это происходит как-то.

Дело в том, что эта команда обновления работает в двух частях? Как сначала он читает значение счетчика (во время которого он не получает эксклюзивную блокировку), а затем записывает новое вычисленное значение (когда он получает эксклюзивную блокировку)?

Пожалуйста, помогите, я действительно запутался.

Ответы [ 2 ]

2 голосов
/ 29 января 2010

Команда обновления не работает в двух частях. Работает только в одном.

Происходит что-то еще, и я думаю, что ваша транзакция откатывается по другой причине. Например, из этих 2000 транзакций одна может быть откатана - особенно если вы делаете кучу вещей одновременно - и она не удалась вовсе.

Это обновление, возможно, не было причиной возникновения проблемы - у вас могут быть взаимоблокировки из-за других транзакций, и они могут завершаться сбоем перед командой обновления (или во время команды обновления).

Я бы уменьшил масштаб и задавал вопросы об обработке ошибок транзакции. Вы все делаете в блоках try / catch? Захватываете ли вы уровни ошибок при сбое транзакций? Если нет, вам нужно будет записать трассировку с помощью Profiler, чтобы выяснить, что происходит.

1 голос
/ 29 января 2010

Вы уверены, что SQL всегда работает? Я имею в виду, может ли это быть случайным тайм-аутом блокировки? Обрабатываете ли вы исключения SQL в своем .Net-коде так, чтобы о них знали (например, всплывающее сообщение или запись в журнале)?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...