SQL Server длительная транзакция

Мне интересно, как дорого обходится ресурс, чтобы выполнить начальную транзакцию для соединения и немедленно обновить / вставить строку в базу данных, и эта транзакция зависает в течение нескольких часов. По сути, я просто хочу выполнить резервирование "серийного номера" для моей системы управления документами. Мои серии очень индивидуальны, и я хочу, чтобы каждый раз, когда пользователь нажимал кнопку "Добавить новый документ", в моей таблице размещения серий было указано следующее значение. Чтобы выделить его, я бы вставил строку в таблицу размещения. В следующий раз, когда новый пользователь запросит следующее значение, прочитает подсказку NOLOCK, чтобы он увидел мое ожидающее вставленное значение, чтобы он также знал следующее значение. Если пользователь отменяет форму, которая добавляет новый документ, я просто выполню откат поверх моего открытого соединения. Если соединение потеряно, и я нахожусь в режиме "добавления", то я бы проверил, совпадает ли текущий идентификатор транзакции, для которой я выделил мою серию, с текущей. Если нет, то я бы выделил еще один. Нет проблем с тем, что пользователь теряет серию из-за потери соединения. Как вы думаете? Я чувствую, что это очень плохая практика, потому что она противоречит идее, которую я усвоил за несколько лет разработки программного обеспечения: как можно раньше открывать соединение и закрывать его как можно скорее.

Заранее спасибо!

2 ответа

Я бы рассмотрел использование последовательностей. Если они не подходят, я бы сделал что-то вроде следующего:

  • Проводите отдельные транзакции для управления своими "номерами серий".
  • Эти транзакции очень короткие и делают, например, "получить следующий номер".
  • Иметь столбец "состояние", чтобы узнать, что-то происходит.
  • Блокировка всей таблицы для управления ее содержимым.

Избегайте NOLOCK. Избегайте длительных транзакций.

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

Вы также можете рассмотреть возможность использования Read Uncommitted или другого уровня изоляции для определенных случаев, таких как последняя неделя прошлого месяца или ежегодная продажа, когда необходимые данные уже присутствуют или допускается незначительная ошибка.

Рассмотрите возможность иметь правильные индексы и правильно упорядоченные объединения, чтобы сократить время выполнения.

Другие вопросы по тегам