Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Массовое обновление или пакетное в begin tran\end tran  [new]
Slava_Nik
Member

Откуда: из России
Сообщений: 901
есть пакет обновления 2000 строк, выполняетя довольно долго, был разбит на пакеты по 100 строк, для уменьшения блокировок на таблицу и времени выполнения.

теперь вопрос

update 2000 строк разом
и
begin transaction
обновление по 100 стро
к примеру update top(100)..
end transaction
будет ли различный объем блокировок в 1-й и в 2-м случае?
Во втором случае, к примеру, если на 9-м апдейте не получилось обновить таблицу из-за блокировки, то должны же откатиться все 8 предыдущих апдейта, соответственно не будет разницы с сразу с полным апдейтом(Upadate 2000 строк )?

получается бесмысленно обновлять по 100 строк явно в инструкции begin transaction\end trans, если необходимо, чтобы точно обновились все 2000 строк? так или нет?
30 июн 11, 15:23    [10900435]     Ответить | Цитировать Сообщить модератору
 Re: Массовое обновление или пакетное в begin tran\end tran  [new]
baracs
Member

Откуда: Москва
Сообщений: 7217
Slava_Nik
пакет обновления 2000 строк
Что это?
Slava_Nik
end transaction
Веткой не ошиблись?
30 июн 11, 15:30    [10900513]     Ответить | Цитировать Сообщить модератору
 Re: Массовое обновление или пакетное в begin tran\end tran  [new]
Slava_Nik
Member

Откуда: из России
Сообщений: 901
baracs,

нет, не ошибся.

инструкция update , которая будет обновлять сразу 2000 строк, а может и чуть более
and tran - это commit transaction (ошибся ) ).
30 июн 11, 15:50    [10900763]     Ответить | Цитировать Сообщить модератору
 Re: Массовое обновление или пакетное в begin tran\end tran  [new]
baracs
Member

Откуда: Москва
Сообщений: 7217
Slava_Nik
update 2000 строк разом
и
begin transaction
обновление по 100 стро
к примеру update top(100)..
end transaction
Начинать явную транзакцию и коммитить ее после одной инструкции UPDATE бессмысленно. Она и так в транзакции выполняется.

Slava_Nik
будет ли различный объем блокировок в 1-й и в 2-м случае?
Если под "объемом" разумеется список блокируемых объектов, то - нет.

Slava_Nik
Во втором случае, к примеру, если на 9-м апдейте не получилось обновить таблицу из-за блокировки, то должны же откатиться все 8 предыдущих апдейта
Почему?
Закоммиченные транзакции уже не откатятся.
Чтобы иметь возможность откатить всю пачку апдейтов, надо их все выполнять в одной, явно открытой транзакции.
Но тогда, не понятно, зачем дробить один UPDATE на несколько...


Вообще, 2000 строк - это не много. Продуктивнее будет разобраться, почему этот апдейт "выполняетя довольно долго".
30 июн 11, 16:34    [10901318]     Ответить | Цитировать Сообщить модератору
 Re: Массовое обновление или пакетное в begin tran\end tran  [new]
Slava_Nik
Member

Откуда: из России
Сообщений: 901
baracs,
довольно долго, потому что еще куча триггеров, и активнок обращение к таблице
по транзакциям снова не поняли друг-друга
1 случай
просто указать в процедуре
update ...
-обновляется 2000 строк , что будет неявная транзакция, которая либо обновляет все 2000 строк , либо откатывает эти 2000 строк по какой-то причине(блокировке например).
2 случай
Begin transaction
цикл update по 100 строк, к примеру,

commit transaction 
явная траназакция, и тут я запутался
Пусть, в этой транзакции 20 циклов обновления, на 19 цикле данные не смогли обновиться, должны же откатиться все 19 обновленных циклов или нет? если да, то получается это эквивалент инструкции
update 2000 строк сразу
или нет?
30 июн 11, 16:51    [10901536]     Ответить | Цитировать Сообщить модератору
 Re: Массовое обновление или пакетное в begin tran\end tran  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31984
Slava_Nik
должны же откатиться все 19 обновленных циклов
Да, должны.
Только для этого нужно выполнить rollback tarn
30 июн 11, 17:08    [10901713]     Ответить | Цитировать Сообщить модератору
 Re: Массовое обновление или пакетное в begin tran\end tran  [new]
Slava_Nik
Member

Откуда: из России
Сообщений: 901
alexeyvg,
если не будет явно указан rollback tran, то отката не будет разве?
это же одна транзакция,в которой явно указано begin и end.
и вопрос по блокировкам остался , будет ли различия в этих случаях?
30 июн 11, 17:33    [10901933]     Ответить | Цитировать Сообщить модератору
 Re: Массовое обновление или пакетное в begin tran\end tran  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31984
Slava_Nik
alexeyvg,
если не будет явно указан rollback tran, то отката не будет разве?
это же одна транзакция,в которой явно указано begin и end.
Зависит от режима коннекта к серверу.

Если установлен SET XACT_ABORT, то откатится само, если не установлен, то нужно обрабатывать самому.

Но лучьше использовать обработчик TRY CATCH, если версия позволяет.

Slava_Nik
и вопрос по блокировкам остался , будет ли различия в этих случаях?
Нет
30 июн 11, 17:52    [10902108]     Ответить | Цитировать Сообщить модератору
 Re: Массовое обновление или пакетное в begin tran\end tran  [new]
baracs
Member

Откуда: Москва
Сообщений: 7217
Slava_Nik
alexeyvg,
если не будет явно указан rollback tran, то отката не будет разве?
это же одна транзакция,в которой явно указано begin и end.
Почитайте про SET XACT_ABORT.

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

Зато наверняка, этот цикл будет выполняться дольше, чем один запрос. Плохая идея.
30 июн 11, 18:03    [10902187]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить