2017-02-23 154 views
0

У меня есть «как работает SQL-сервер внутри» - запрос.Когда вы можете увидеть эффект от вашего обновления, вставить и удалить во время вызова хранимой процедуры?

Если я создаю 4 хранимые процедуры:

SP1 - FetchNamesFromSourceTable (takes 10 minutes to run) 
SP2 - UpdateNamesWithAttendanceInfo (takes 5 minutes to run) 
SP3 - AddAddressToNames (takes 8 minutes to run) 

SP4 - RunUpdate which will run SP1, 2 and 3 in sequence. 

Теперь, если мы предположим, что SP извлекает имена из таблицы OriginalNames в таблицу NamesWithAttendanceAndAddresses (это просто пример), и мы предполагаем, что NamesWithAttendanceAndAddresses пуста, первая время я запускаю это.

Теперь, если я вызываю SP4, а затем выберите * из NamesWithAttendanceAndAddresses через 16 минут, увижу ли я результат SP1 и SP2 или я не смогу увидеть какой-либо результат вообще в NamesWithAttendanceAndAddresses до тех пор, пока SP4 полностью не запустит его курс ??

+0

Это касается MS SQL-сервера, поэтому это Transact SQL. –

+0

Это зависит от возможных факторов, таких как блокировка, уровни изоляции – TheGameiswar

ответ

2

Все зависит от уровня изоляции транзакций. Кроме того, это не имеет ничего общего с самими процедурами, но с транзакциями.

Уровень изоляции транзакций по умолчанию (READ COMMITTED в SQL Server) и выше, ваш SP4 сможет увидеть изменения, сделанные пакетом обновления 1, только после совершения транзакции обновления в пакете обновления 1. Является ли сам SP1 или нет, не имеет значения.

С уровнем изоляции READ UNCOMMITTED (не рекомендуется). SP4 сможет увидеть измененные данные, как только страницы данных будут обновлены в памяти.

+0

Как насчет внешнего SP4? Если я проверю изнутри SP4, я получаю, что я могу видеть результаты SP1, но если я запустил SP4 и проверил бы извне, все равно будет то же самое? Я полагаю, да, но я не уверен на 100%. –

+1

Дело в том, что это действительно не имеет значения, это SP4, SP123 или что-то еще. Если транзакция, которая изменила данные, зафиксировала изменения, все ее увидят; если он еще не зафиксирован, только процессы, запущенные на уровне изоляции READ UNCOMMITTED, будут видеть измененные данные. (Но это не транзакционно непротиворечиво, а также можно отбросить назад, так что ...) – dean