2015-12-08 4 views
0

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

Спасибо заранее!

ответ

0

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

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

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

0

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

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

Рассмотрите наличие надлежащих индексов и правильно упорядоченных соединений для уменьшения времени выполнения.

Смежные вопросы