Переключение на Главную Страницу Страницы: [1] 2  ОтправитьПечать
Горячая тема (более 10 ответов) Как массово заменить в хранимой процедуре TABLOCKX на ROWLOCK (число прочтений - 4512 )
Maxo
Junior Member
**
Отсутствует


I Love YaBB 2!

Сообщений: 15
Зарегистрирован: 28. Декабря 2006
Как массово заменить в хранимой процедуре TABLOCKX на ROWLOCK
15. Июня 2011 :: 04:43
Печать  
Хочу попробовать гибкие блокировки, а руками изменять процедуры нехочется
  
Наверх
 
IP записан
 
Maxo
Junior Member
**
Отсутствует


I Love YaBB 2!

Сообщений: 15
Зарегистрирован: 28. Декабря 2006
Re: Как массово заменить в хранимой процедуре TABLOCKX на ROWLOCK
Ответ #1 - 15. Июня 2011 :: 08:41
Печать  
сделал вот так

--If (select Object_ID('#t1'))IS NOT NULL  Drop Table #t1

Drop Table #t1
SELECT so.name, so.id, Ctext, text
INTO #t1
     FROM dbo.sysobjects so
     JOIN dbo.syscomments sc      ON so.[id] = sc.[id]
     WHERE xtype='P'
       AND (Substring(so.name,5,3) IN ('_DH','_DT','_RA','_RG')
          OR Substring(so.name,7,7) = '1SJOURN')
     AND CharINDEX('Lock',so.name) > 0
     ORDER BY so.name


--select * from #t1

Declare @a VarChar(8000)
DECLARE @id Int
           
While ( Select Count(*) FROm #t1) > 0
begin
SELECT TOP 1 @a=Text, @id = id FROM #t1

SELECT @a= REPLACE(@a,'Create ','Alter ')
SELECT @a= REPLACE(@a,'holdlock','')
SELECT @a= REPLACE(@a,'tablock ','rowlock ')
SELECT @a= REPLACE(@a,'tablockx','rowlock ')
SELECT @A
--EXEC(@A)
DELETE #t1 WHERE id = @ID

end

  
Наверх
 
IP записан
 
berezdetsky
1c++ power user
Отсутствует


barba non facit sisadminum

Сообщений: 1986
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Как массово заменить в хранимой процедуре TABLOCKX на ROWLOCK
Ответ #2 - 15. Июня 2011 :: 08:58
Печать  
И на какие именно rows в твоих процедурах будут установлены блокировки этим rowlock?  Подмигивание
  

пароль как коньяк, чем больше звездочек, тем лучше
Наверх
IP записан
 
Maxo
Junior Member
**
Отсутствует


I Love YaBB 2!

Сообщений: 15
Зарегистрирован: 28. Декабря 2006
Re: Как массово заменить в хранимой процедуре TABLOCKX на ROWLOCK
Ответ #3 - 17. Июня 2011 :: 06:10
Печать  
виноват, NOLOCK
  
Наверх
 
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Как массово заменить в хранимой процедуре TABLOCKX на ROWLOCK
Ответ #4 - 17. Июня 2011 :: 07:03
Печать  
Maxo писал(а) 17. Июня 2011 :: 06:10:
виноват, NOLOCK

А смысл
Если нагрузка на sql сервер маленькая выигрыша не будет никакого.
Если нагрузка бальшая то заменив во всех 1с хранимых процедурах на nolock нарвешься на несогласованность данных ( и-или вылеты из 1с) и будешь очень долго искать причины.
  
Наверх
 
IP записан
 
Maxo
Junior Member
**
Отсутствует


I Love YaBB 2!

Сообщений: 15
Зарегистрирован: 28. Декабря 2006
Re: Как массово заменить в хранимой процедуре TABLOCKX на ROWLOCK
Ответ #5 - 17. Июня 2011 :: 08:05
Печать  
У меня проблема с одновременным проведением документов,
Остатки не нужны
Сейчас народ вздохнул с облегчением
  
Наверх
 
IP записан
 
Maxo
Junior Member
**
Отсутствует


I Love YaBB 2!

Сообщений: 15
Зарегистрирован: 28. Декабря 2006
Re: Как массово заменить в хранимой процедуре TABLOCKX на ROWLOCK
Ответ #6 - 17. Июня 2011 :: 08:07
Печать  
Несогласованность данных, имеешь в виду дедлоки?
Когда все таблицы открыты дедлок не страшен
  
Наверх
 
IP записан
 
Satans Claws
God Member
*****
Отсутствует


1C++ rocks!

Сообщений: 721
Зарегистрирован: 29. Ноября 2010
Re: Как массово заменить в хранимой процедуре TABLOCKX на ROWLOCK
Ответ #7 - 17. Июня 2011 :: 08:13
Печать  
Maxo писал(а) 17. Июня 2011 :: 08:07:
Несогласованность данных, имеешь в виду дедлоки?
Когда все таблицы открыты дедлок не страшен


Когда 2 документа видят остаток в 30 штук, один списывает 18, другой 15, а в таблицу остатков после одновременного проведения этих двух документов пишется вообще 12 (или 15 - это как повезет).
т.е. а) у тебя по факту списалось "в минус" (но это не так страшно)
б) у тебя в таблице остатков появилось число, связанное с реальным положением вещей чуть менее, чем никак.
  
Наверх
 
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Как массово заменить в хранимой процедуре TABLOCKX на ROWLOCK
Ответ #8 - 17. Июня 2011 :: 09:52
Печать  
Maxo писал(а) 17. Июня 2011 :: 08:07:
Несогласованность данных, имеешь в виду дедлоки?
Когда все таблицы открыты дедлок не страшен

нет
хотя бы создание новых длкументов.
Одновременое обращение к к одной таблице rg может привести к занесению неправильного остатка.

  
Наверх
 
IP записан
 
berezdetsky
1c++ power user
Отсутствует


barba non facit sisadminum

Сообщений: 1986
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Как массово заменить в хранимой процедуре TABLOCKX на ROWLOCK
Ответ #9 - 19. Июня 2011 :: 16:18
Печать  
Maxo писал(а) 17. Июня 2011 :: 06:10:
виноват, NOLOCK

Т.е. вопрос ты не понял. Проехали.

Maxo писал(а) 17. Июня 2011 :: 08:05:
У меня проблема с одновременным проведением документов,
Остатки не нужны
Сейчас народ вздохнул с облегчением

Рекомендую уволиться до того момента, когда народу остатки понадобятся.

Z1 писал(а) 17. Июня 2011 :: 09:52:
Одновременое обращение к к одной таблице rg может привести к занесению неправильного остатка.

В лучшем случае.  Улыбка
  

пароль как коньяк, чем больше звездочек, тем лучше
Наверх
IP записан
 
Neo
Senior Member
****
Отсутствует


I Love YaBB 2!

Сообщений: 327
Зарегистрирован: 12. Ноября 2007
Re: Как массово заменить в хранимой процедуре TABLOCKX на ROWLOCK
Ответ #10 - 20. Июня 2011 :: 08:12
Печать  
Цитата:
И на какие именно rows в твоих процедурах будут установлены блокировки этим rowlock?


Видимо, на те, к которым будет обращение в рамках транзакции проведения например...  
  
Наверх
 
IP записан
 
Satans Claws
God Member
*****
Отсутствует


1C++ rocks!

Сообщений: 721
Зарегистрирован: 29. Ноября 2010
Re: Как массово заменить в хранимой процедуре TABLOCKX на ROWLOCK
Ответ #11 - 21. Июня 2011 :: 03:53
Печать  
Neo писал(а) 20. Июня 2011 :: 08:12:
Цитата:
И на какие именно rows в твоих процедурах будут установлены блокировки этим rowlock?


Видимо, на те, к которым будет обращение в рамках транзакции проведения например...  



Стандартная схема работы 7.7 с блокировками следующая:
перед проведением выполняются ХП, которые блокируют необходимые таблицы (целиком).
Потом работают алгоритмы модуля проведения и делаются записи в таблицы движений, итогов, etc

если в ХП банально заменить таблок на роулок, то получим что-то в духе
Код
Выбрать все
from _1SJOURN(rowlock) where 0=1 

- т.е. нифига блокировок наложено не будет.
Если выкинуть условие - то будет наложена блокировка, опять же, на ВСЮ таблицу.

Чтобы передавать параметр в эту хранимку - это надо пилить и пилить 1Ску, да так, что у 1С++ глаз задергается в нервном тике.

Более того - работа с rowlock-ом очень и очень задроченная - ради интереса, можешь найти ТойСКЛ с его гнутыми блокировками и покурить, сколько действий приходится делать в каждом модуле проведения. В этом плане в снеговике - весьма и весьма юзер френдли сделано.

Ну и камень в огород Тоя - реализация блокировок очень и очень своеобразная (через блокировки виртуальных объектов), что в крупных базах может сжирать непозволительно много оперативки, особенно, если действовать бездумно и в "тяжелых" документах продолжать использовать блокировки по ключам, вместо блокировки "таблиц" целиком.

В свете вышенаписанного, самое разумное решение - это писать нехилый класс по работе с построчными блокировками, в котором будут методы, позволяющие достаточно просто блокировать таблицу регистра целиком/по набору измерений + в нетривиальных случаях в самом модуле проведения делать сбор данных запросами с нужными хинтами.
И при всем при этом, главное - продумать механизм, не допускающий дэдлоков.
  
Наверх
 
IP записан
 
Neo
Senior Member
****
Отсутствует


I Love YaBB 2!

Сообщений: 327
Зарегистрирован: 12. Ноября 2007
Re: Как массово заменить в хранимой процедуре TABLOCKX на ROWLOCK
Ответ #12 - 21. Июня 2011 :: 06:21
Печать  
Цитата:
если в ХП банально заменить таблок на роулок, то получим что-то в духе:

from _1SJOURN(rowlock) where 0=1

- т.е. нифига блокировок наложено не будет.


В момент выполнения такой команды разумеется не наложится. Но если открыть транзакцию, написать что-то типа from _1SJOURN(rowlock holdlock) where 0=1, то потом при обращении к конкретным строкам в ходе транзакции по идее должны заблокироваться нужные строки. Не экспериментировал,  так что это просто мои мысли.

Просто встречал в принципе 2 подхода к установлению блокировок. 1-й, это когда полностью отключаешь стандартные блокировки, а потом сам накладываешь по нужным измерениям каждый раз в модуле проведения. 2-й, это простая замена табличных блокировок на построчные. Этот тот случай, который мы тут обсуждаем.
  
Наверх
 
IP записан
 
Neo
Senior Member
****
Отсутствует


I Love YaBB 2!

Сообщений: 327
Зарегистрирован: 12. Ноября 2007
Re: Как массово заменить в хранимой процедуре TABLOCKX на ROWLOCK
Ответ #13 - 21. Июня 2011 :: 08:21
Печать  
Цитата:
если открыть транзакцию, написать что-то типа from _1SJOURN(rowlock holdlock) where 0=1, то потом при обращении к конкретным строкам в ходе транзакции по идее должны заблокироваться нужные строки


Попробовал так сделать, по ходу, это имеет место быть только если происходит модификация строк, тогда до конца транзакции накладывается построчная блокировка. Если только чтение, то блокировки не накладываются.
  
Наверх
 
IP записан
 
Satans Claws
God Member
*****
Отсутствует


1C++ rocks!

Сообщений: 721
Зарегистрирован: 29. Ноября 2010
Re: Как массово заменить в хранимой процедуре TABLOCKX на ROWLOCK
Ответ #14 - 22. Июня 2011 :: 05:50
Печать  
Neo писал(а) 21. Июня 2011 :: 06:21:
В момент выполнения такой команды разумеется не наложится. Но если открыть транзакцию, написать что-то типа from _1SJOURN(rowlock holdlock) where 0=1, то потом при обращении к конкретным строкам в ходе транзакции по идее должны заблокироваться нужные строки. Не экспериментировал,  так что это просто мои мысли.


Смотри:
Если ты пишешь в модуле проведения Регистр.Партии.ДвижениеПриходВыполнить() - то 1Ска сделает запись в регистр + пересчитает записи в таблице итогов (емнип, это делается через ХП - но утверждать не буду).
При этом, сама 1Ска никаких блокировок уже не накладывает - более того, в этот момент они уже бессмысленны.
Т.е. вырубив штатный механизм тебе в любом случае нужно будет ручками делать перед всеми движениями примерно такое:
"select period from $РегистрИтоги.Партии (rowlock holdlock) where <условия по измерениям>".
В случае, если ты партии собираешься списывать (особенно, если по ФИФО/ЛИФО/етц - когда в начале проведения ты не знаешь, какие именно партии ты будешь списывать) - наложение блокировок на строки, скорее всего, можно совместить со сбором данных.


Я собственно, все эти пространственные пассажи к чему - если всерьез намерился выносить стандартный механизб блокировок 1С и писать ручками свои - то глушить ХП проще так:
CREATE procedure [dbo].[_1sp_RA39000_TLock] AS return
Роулоки там нафиг не сдались
  
Наверх
 
IP записан
 
Переключение на Главную Страницу Страницы: [1] 2 
ОтправитьПечать