Подтвердить что ты не робот

Что такое (разница) между NOLOCK и UNCOMMITTED

Я использую SQL Server 2012.

Я пишу два запроса, но что другое между NOLOCK и UnCommitted?

SELECT lastname, firstname
FROM HR.Employees with (READUNCOMMITTED)

SELECT lastname, firstname 
FROM HR.Employees with (NoLock)
4b9b3361

Ответ 1

NOLOCK: эквивалентен READUNCOMMITTED (источник: MSDN)

NOLOCK или READUNCOMMITTED Указывает, что грязные чтения разрешены. Не выпущены общие блокировки, чтобы другие транзакции не изменяли данные, прочитанные текущей транзакцией, а исключительные блокировки, установленные другими транзакциями, не блокируют текущую транзакцию от чтения заблокированных данных. Разрешение грязных чтений может вызвать более высокий concurrency, но за счет чтения изменений данных, которые затем откатываются другими транзакциями.

Подсказки

READUNCOMMITTED и NOLOCK применяются только к блокировкам данных. Все запросы, включая те, что with READUNCOMMITTED and NOLOCK hints, получают блокировку Sch-S (стабильность схемы) во время компиляции и выполнения. Из-за этого запросы блокируются, когда параллельная транзакция содержит блокировку Sch-M (модификация схемы) в таблице

Ответ 2

Под капотом они выполняют одно и то же действие.

Уровень изоляции read-uncommitted - это наименее ограничивающий уровень изоляции в SQL Server, что также делает его популярным для разработчиков, когда он хочет уменьшить блокировку.

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

только разница между ними состоит в том, что уровень изоляции read-uncommitted определяет механизм блокировки для всего соединения, а подсказка таблицы nolock определяет механизм блокировки для таблицы, на которую вы даете намек.

Ответ 3

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

Единственное различие заключается в том, что вы можете применять WITH(NOLOCK) выборочно, на некоторых таблицах, но не в других. READ UNCOMMITTED применяет NOLOCK ко всем таблицам в сеансе.

Если вы это сделаете:

SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED

SELECT *
FROM Table1 T1
INNER JOIN Table2 T2 ON T1.ID = T2.id

Он функционально эквивалентен:

SELECT *
FROM Table1 T1 WITH(NOLOCK)
INNER JOIN Table2 T2 WITH(NOLOCK) ON T1.ID = T2.ID

Но вы также можете выборочно применить WITH(NOLOCK):

SELECT *
FROM Table1 T1 WITH(TABLOCK)
INNER JOIN Table2 WITH(NOLOCK) ON T1.ID = T2.ID

Ответ 4

На уровне выступов нет разницы.

Вы можете установить READUNCOMMITED на уровне сеанса, и здесь вам нужно написать УСТАНОВИТЬ УРОВЕНЬ ИЗОЛЯЦИИ УСТАНОВКИ НЕ ПРОПУСТИТЕ

Ответ 5

Для NOLOCK нам нужно поместить этот подсказку на уровне таблицы, поэтому для каждого уровня таблиц, которые используются в транзакции обновления, требуется разместить их. Таким образом, очень много времени и времени, чтобы положить его повсюду, таблицы ссылаются на запрос. Для READ UNCOMMITTED нам не нужно размещать его на каждом уровне таблиц, просто размещать на уровне сеанса или уровне запросов и писать в верхней части запроса или хранимой процедуры. Давайте рассмотрим небольшую демоверсию, чтобы ее разработать. Сначала проверьте уровень изоляции базы данных по умолчанию

CREATE TABLE SAMPLETABLE
(
Col1 INT ,
Col2 VARCHAR(100)
)

INSERT INTO SAMPLETABLE(Col1,Col2)
SELECT 1,'Col1'
Union all
SELECT 2,'Col1'

BEGIN TRANSACTION 

Update SAMPLETABLE Set Col2 = 'Value changed' Where col1 =1

Select * from SAMPLETABLE with (nolock)



SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED

Select * from SAMPLETABLE 

Вывод равен 1, Col1 для запроса