2017-02-15 4 views
0

Я использую хранимую процедуру, которая возвращает 5-6 таблиц, и эта процедура может использоваться одновременно многими пользователями (5-10 пользователей) одновременно.Блокировка таблицы в хранимой процедуре

Процедура имеет только операторы «Выбрать».

Так что я просто хотел подтвердить, что всякая блокировка применяется для таблиц хранимой процедуры всякий раз, когда процедура вызовет или не будет блокировки.

Я использую MS SQL Server 2012 и Visual Studio 2013.

+0

yes Замок применяется на столе и его самой базовой концепции, которую вы должны знать. если кто-то вставляет или обновляет таблицу записей, будет заблокирован и разблокирован. лучший способ - использовать инструкцию select следующим образом: select * from table with (nolock) .... после того, как данные вставлены или обновлен, блокировка будет удалена автоматически. –

+0

@ Dirty, в моей процедуре я использую только выражения «Выбрать». Итак, вы имеете в виду, что мне нужно изменить свой запрос следующим образом: Выберите * из таблицы с (nolock) – sunil

+0

Не используйте «с (nolock) «Это позволит вашей процедуре читать строки, которые в настоящее время обновляются или даже удаляются с помощью текущей транзакции, прежде чем они будут совершены (грязные чтения). –

ответ

1

Там будет S (shared) locks: «Используется для операций чтения, которые не изменяются или обновлять данные, такие как ЗЕЬЕСТ.» Обратите внимание, что S-lock не предотвращает другие операции чтения.

0

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

1

существует ли какая-либо блокировка для таблиц хранимой процедуры всякий раз, когда процедура вызовет или не будет блокировки.

оператор выбора, будет взять общий locks.How долго этот замок будет приниматься в зависимости от уровня изоляции

Readcommitted: замок будет немедленно освобожден после прочтения строки

Повторяется чтения: общий замок будет снят до конца транзакции, поэтому выбранные строки не могут быть изменены

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

+0

# TheGameiswar, Если я не использую уровень изоляции тогда?Значит я просто с помощью оператора выбора, как this- Select * из таблицы Или что произойдет, если я использую NOLOCK как this- Select * из таблицы (NOLOCK) – sunil

+0

@sunil: при использовании NOLOCK, это означает, что вы может иметь возможность считывать незафиксированные данные – TheGameiswar

+0

@Sunil, уровень изоляции по умолчанию - Read Committed. Поэтому, если вы не указали уровень изоляции, вы используете Read Committed. –

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