Обновление без блокировки внутри транзакции

Возможен ли следующий сценарий в SQL Server с одним активным подключением?

Внутри транзакции READCOMMITED мне нужно обновить одну таблицу, не блокируя ее. Например, каждый раз, когда я выполняю инструкцию, я увеличиваю поле в этой таблице. Эту операцию не нужно откатывать в случае сбоя транзакции. Кроме того, это обновление не должно блокировать других одновременных пользователей, которые пытаются обновить ту же позицию.

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
4
0
4 270
2

Ответы 2

Вы не можете выполнить обновление без блокировки таблицы. Это необходимо для того, чтобы уровень изоляции ДРУГИХ транзакций мог контролировать, могут ли они «видеть» изменения, внесенные в обновление. Вы можете изменить уровень изоляции транзакции для обновления, но это влияет только на сеанс обновления (где вы его устанавливаете), контролируя, может ли обновление "видеть" изменения, сделанные в других сеансах ...

Если вы хотите, чтобы ДРУГИЕ операторы Sql могли видеть то, что вы делаете в этом обновлении, как если бы оно не было заблокировано, вам нужно изменить уровень изоляции транзакции для этих других tx на Read Uncommited. (Будьте осторожны ... Этот уровень изоляции может допускать многочисленные несоответствия в вашей базе данных.)

Вы не можете не заблокировать таблицу во время записи.

Вы имеете в виду, что хотите записать в таблицу, но при этом исключительная блокировка нет сохраняется до фиксации / отката?

Если это так, поместите нужные вам значения в переменную таблицы (на которую не влияет откат / фиксация) и отложите запись после основной транзакции. Затем выполните одно обновление, чтобы передать значение из табличной переменной.

Обновлено: Обходной путь SQL 2008, с другими идеями позже

tx, автономные транзакции действительно интересны.

Kevin Dente 26.11.2008 16:15

Что касается вашего решения поместить его в переменную таблицы, скажем, у меня есть длинный SP, который вставляется в таблицу и получает значение IDENTITY для этой вставки, и теперь я делаю другие вещи в соответствии с этим значением .... Использование вашего решения Как бы я сделай это ? Я не думаю, что смогу это сделать. (У меня также есть длинный sp, который заставляет много ЦП отменять множество вставок на основе Identities, но я не хочу блокировать всю систему) ... Может ли ваше решение решить эту проблему?

Royi Namir 19.02.2013 14:08

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