2015-02-17 2 views
0

У меня есть SP с уровнем изоляции транзакции, установленным как Read Uncommitted. Для примераОбновление внутри прочитанной незафиксированной транзакции

Create Procedure TrailSP 
AS 
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED; 
BEGIN TRY 

UPDATE TrialTable 
SET TrailColumn ='Update' 
WHERE TrailID=1 

--this is followed by more updates and selects 

END TRY 
BEGIN CATCH 

RETURN -1; 
END CATCH 

RETURN 0; 

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

+1

Вы нормально с пропавшими без вести и/или дублировать данные в вашей процедуре? Установка уровня изоляции для чтения без фиксации - это как добавление подсказки nolock к каждому запросу в вашей процедуре. http://sqlblogcasts.com/blogs/tonyrogerson/archive/2006/11/10/1280.aspx –

+0

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

+1

Вы говорите что каждая из ваших процедур использует этот уровень изоляции? Вам действительно нужно прочитать этот намек и понять, что это на самом деле означает. Это НЕ какая-то волшебная кнопка «быстро». Это означает, что ни одна из ваших процедур не является точной. Если точность важна, вам необходимо удалить эту практику из вашей компании. –

ответ

2

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

Если вызов вашей процедуры имеет транзакцию, то фиксация произойдет, когда совершит транзакцию.

Если вызов вашей процедуры не имеет транзакции, но сеанс разрешен implicit transactions, он будет зафиксирован, когда приложение явно зафиксирует.

Если вызов вашей процедуры не имеет транзакции, а сеанс имеет поведение транзакции автоматической фиксации (т. Е. Наиболее распространенный случай), то транзакция будет зафиксирована при завершении инструкции UPDATE.

Включение READ UNCOMMITTED для ОБНОВЛЕНИЯ - это не-op.

0

-Всем данные, прочитанные внутри READ UNCOMMITTED, являются данными, которые могут исчезнуть из-за транзакции, которая написали ее откат.

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

-Интакже, что строка может отсутствовать или дублироваться из-за PageSplit.

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

TLDR: никогда не используйте READ UNCOMMITTED

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