Имя: Пароль:
1C
1C 7.7
v7: Гибкие блокировки
0 alexandr_87
 
18.03.15
16:34
Решил сделать свой "гибкие блокировки".Но иногда выскакивает ошибка "invalid cursor state.несовместимая ошибка базы данных" и программа вылетает.Ниже код.
1 alexandr_87
 
18.03.15
16:34
try
                    qwerty="
                    |ALTER  procedure _1sp__1SENTRY_TLockX AS
                    |set nocount on declare i integer select i=1 from _1SENTRY(ROWLOCK HOLDLOCK) where 0=1";
                    con.execute(qwerty);
                    
                    qwerty="
                    |ALTER  procedure _1sp__1SENTRY_TLock AS
                    |set nocount on declare i integer select i=1 from _1SENTRY(ROWLOCK HOLDLOCK) where 0=1";
                    con.execute(qwerty);
                except
                    err=err+?(err<>"",linebreak,"")+"?? ????????? ?????????? ??????? ????????..."+linebreak+
                    "???????? ??????: "+geterrordescription()+linebreak+
                    "---------------------------------------------------------------------------------------";    
                endtry;
//                
//                
                try
                    qwerty="
                    |ALTER  procedure _1sp__1SOPER_TLockX AS
                    |set nocount on declare i integer select i=1 from _1STOPER(ROWLOCK HOLDLOCK) where 0=1";
                    con.execute(qwerty);
                    
                    qwerty="
                    |ALTER  procedure _1sp__1SOPER_TLock AS
                    |set nocount on declare i integer select i=1 from _1STOPER(ROWLOCK HOLDLOCK) where 0=1";
                    con.execute(qwerty);
                except
                    err=err+?(err<>"",linebreak,"")+"?? ????????? ?????????? ??????? ????????..."+linebreak+
                    "???????? ??????: "+geterrordescription()+linebreak+
                    "---------------------------------------------------------------------------------------";    
                endtry;
2 alexandr_87
 
18.03.15
16:35
try
                    qwerty="
                    |ALTER procedure [dbo].[_1sp__1SJOURN_TLockX] AS
                    |set nocount on declare i integer select i=1 from _1SJOURN(ROWLOCK HOLDLOCK) where 0=1";
                    con.execute(qwerty);
                    
                    qwerty="
                    |alter procedure _1sp__1SJOURN_TLock AS
                    |set nocount on declare i integer select i=1 from _1SJOURN(ROWLOCK HOLDLOCK) where 0=1";
                    con.execute(qwerty);
                except
                    err=err+?(err<>"",linebreak,"")+"?? ????????? ?????????? ??????? ??????????..."+linebreak+
                    "???????? ??????: "+geterrordescription()+linebreak+
                    "---------------------------------------------------------------------------------------";    
                endtry;
3 alexandr_87
 
18.03.15
16:35
qwerty="declare dt_cur cursor for
                |select name
                |from sysobjects
                |where (name like 'DT%') and (name not like '%NEW%')
                |and type = 'U' and OBJECTPROPERTY(id,'IsMSShipped') = 0
                |open dt_cur
                |declare @dt_name varchar(50)
                |declare @sql varchar(1000)
                |fetch next from dt_cur into @dt_name
                |while @@FETCH_STATUS = 0
                |begin
                |select @sql = 'alter procedure _1sp_'+@dt_name+'_TLock AS set nocount on declare i integer select i=1 from '+@dt_name+'(ROWLOCK HOLDLOCK) where 0=1'

                |execute(@sql)
                |select @sql = 'alter procedure _1sp_'+@dt_name+'_TLockX AS set nocount on declare i integer select i=1 from '+@dt_name+'(ROWLOCK HOLDLOCK) where 0=1'

                |execute(@sql)
                |fetch next from dt_cur into @dt_name
                |end
                |close dt_cur
                |DEALLOCATE dt_cur";  
                con.execute(qwerty);
                
                qwerty="declare dh_cur cursor for
                |select name
                |from sysobjects
                |where (name like 'DH%') and (name not like '%NEW%')
                |and type = 'U' and OBJECTPROPERTY(id,'IsMSShipped') = 0
                |open dh_cur
                |declare @dh_name varchar(50)
                |declare @sql varchar(1000)
                |fetch next from dh_cur into @dh_name
                |while @@FETCH_STATUS = 0
                |begin
                |select @sql = 'alter procedure _1sp_'+@dh_name+'_TLock AS set nocount on declare i integer select i=1 from '+@dh_name+'(ROWLOCK HOLDLOCK) where 0=1'

                |execute(@sql)
                |select @sql = 'alter procedure _1sp_'+@dh_name+'_TLockX AS set nocount on declare i integer select i=1 from '+@dh_name+'(ROWLOCK HOLDLOCK) where 0=1'

                |execute(@sql)
                |fetch next from dh_cur into @dh_name
                |end
                |close dh_cur
                |DEALLOCATE dh_cur";  
                con.execute(qwerty);
4 alexandr_87
 
18.03.15
16:35
это все вызывается при начале работы системы
5 alexandr_87
 
18.03.15
16:36
Понимаю решение не из лучших,но другого выхода нету.
6 ДенисЧ
 
18.03.15
16:37
во всех процедруах поставь set nocount on в обязательном порядке.
7 alexandr_87
 
18.03.15
16:38
как лучше все решить, а то эти блокировки задолбали
8 Ёпрст
 
18.03.15
16:39
конфа какая ?
бухня? пуб ? комплексная ?
9 alexandr_87
 
18.03.15
16:40
конфа самописная,на основе бухгалтерской
10 Ёпрст
 
18.03.15
16:47
и время ожидания захвата таблиц какое стоит у юзверей ?
11 alexandr_87
 
18.03.15
16:48
0 всем поставил
12 Дык ё
 
18.03.15
16:52
(11) как думаешь, какая строка заблокируется хинтом rowlock по условию 0=1 ?
13 alexandr_87
 
18.03.15
17:01
думаю что ничто не будет блокировать, если я правильно понял
14 Дык ё
 
18.03.15
17:06
(13) тогда почему бы не 'alter procedure _1sp_'+@dh_name+'_TLockX AS set nocount on'?

а по теме:
1. сняты не все блокировки
2. не установлены (?) свои, это приведет к некорректным итогам регистров и взаимоблокировкам
15 alexandr_87
 
18.03.15
17:11
я снял только по документам и журналам
16 Ёпрст
 
18.03.15
17:16
эх ё..
поснимать блокировки плёвое дело, а вот разгребать потом..
:)
то еще занятие
17 alexandr_87
 
18.03.15
17:23
Тогда какие снять а какие оставить?
18 varelchik
 
18.03.15
17:52
(17) Вы дружище луче конфу оптимизировали а не занимались ерундой.
19 alexandr_87
 
18.03.15
17:56
Да вроде все быстро проводится, сдесь проблема в большое количество пользователей -60, 30 работают интенсивно(калл центр)
20 FN
 
18.03.15
23:14
(1) этот код наверное самая маленькая часть гибких блокировок.
(9) На бухкомпоненте выхлоп от ГБ крайне незначительный, в отличие от регистров, где итоги по измерениям, а не по счетам.
Луше оптимизируй код, в крайнем случае делай отложенное проведение
(19) быстро - это сколько микросекунд?
21 alexandr_87
 
19.03.15
16:27
Сделал отложенное проведение и перед ввода нового или записи документа,проверяю на Блокировку ХП,если она выполняется то все идет дальше ежели нет тогда вывожу по таймауту предупреждение об блокировки таблицы тем самым уменшая нагрузку на сервер.
22 alexandr_87
 
19.03.15
16:27
вот код:
Процедура ПриЗаписи()    
    RS=СоздатьОбъект("ODBCRecordSet");
    RS.ВыполнитьИнструкцию("set lock_timeout 2000");
    Попытка
        сообщить(RS.ВыполнитьИнструкцию("exec _1sp__1SJOURN_TLock"));
        RS.ВыполнитьИнструкцию("set lock_timeout -1");
    Исключение  
        Предупреждение("Подождите.Блокировка таблицы"+РазделительСтрок+"Повторите попытку через пару секунд.");
        RS.ВыполнитьИнструкцию("set lock_timeout -1");
        СтатусВозврата(0);
        Возврат;
    КонецПопытки;
23 alexandr_87
 
19.03.15
16:29
set lock timeout может быть любое значение в миллисекундах, я поставил 2 секунды вроде нету уже этой очереди при блокировке когда по 5-6 человек падали в очередь
24 toypaul
 
гуру
19.03.15
16:47
не зная броду, хлебнешь горя :)
25 toypaul
 
гуру
19.03.15
16:48
(20) делал на бухне по субконто. даже работало. но хемороя дофига.
26 alexandr_87
 
19.03.15
17:05
Надо делать свой блокировки о то дед локов не наберешься,даже хуже работает...
27 Гёдза
 
19.03.15
17:29
проще на 8 перейти
28 Дык ё
 
19.03.15
17:37
(25) для бухитогов у софтпойнта красиво сделано - там записи добавляются вместо апдейта, и сворачиваются периодически
29 FN
 
19.03.15
21:41
(28) в 8-ке это вроде как Разделение итогов назвали.
(25) как пересчет итогов по счетам реализовал, при параллельном проведении по одному и тому же счету?
30 Dmitry1c
 
19.03.15
21:47
Что ж вы творите
31 FN
 
19.03.15
21:50
(21) отложенное проведение, это когда пользователь закрыл документ и работает себе дальше, а робот за ним проводит этот документ. в итоге все проводится без блокировок по очереди,  но с задержкой. естественно нужно учитывать бизнес логику.
32 Злопчинский
 
19.03.15
21:50
(27) и что с этим монстром делать?
33 toypaul
 
гуру
20.03.15
15:16
(29) в таблице были добавлено субконто, по которому "паралелилось". и сверху всякой фигни накручено, чтобы все типовые механизмы вплоть до пересчета итогов работало.
Компьютер — устройство, разработанное для ускорения и автоматизации человеческих ошибок.