Переключение на Главную Страницу Страницы: [1]  ОтправитьПечать
Очень популярная тема (более 25 ответов) Как обойти блокировку таблицы _1SBKTTLC? (число прочтений - 11672 )
chicago
Senior Member
****
Отсутствует


1C++, I have nothing to
say more!

Сообщений: 316
Местоположение: Тернополь-Киев
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Как обойти блокировку таблицы _1SBKTTLC?
18. Сентября 2009 :: 13:39
Печать  
Есть:
1. 1С SQL 7.70.0.25.
2. Microsoft SQL Server  2000 - 8.00.2055 (Intel X86).
3. В процесе разработки собственного механизма блокировок возникла следующая проблемма. Необходимо при проведении документа который участвует в бух. учете (формирует бух. операции, проводки) разработать механизм исключающий взаимоблокировки.

При проведении документа, при вызове метода
Код
Выбрать все
Операция.Записать(); 


выполняется одна из хран. процедур, а именно "_1sp__1SBKTTLC_ChangeTotal".
В тексте данной процедуры есть
Код
Выбрать все
...
Update _1SBKTTLC
set
OB1=OB1+@Ob1,
OB2=OB2+@Ob2,
OB3=OB3+@Ob3,
DTFLAGS=@DtFlags,
KTFLAGS=@KtFlags
where
DATE=@Date and KIND=@Kind and ACCKTID=@AccKtId and ACCDTID=@AccDtId and CURRID=@CurId
... 

.
4. Вопрос(ы):
1. Почему при выполнении даной процедуры с параметрами
@Date = Дат1;
@Kind = Вид1;
@AccKtId = СчК1
@AccDtId = СчД1
@CurId = Вал1
следующим запросом
Код
Выбрать все
SET LOCK_TIMEOUT 500
DECLARE @РезБло smallint
SELECT @РезБло = 1
FROM _1SBKTTLC AS ТабБло WITH (INDEX(PK__1SBKTTLC), ROWLOCK, XLOCK)
WHERE
(ТабБло.DATE = Дат1) AND (ТабБло.ACCDTID = СчД3) AND (ТабБло.ACCKTID = СчК4) 


я не могу наложить необходимую блокировку?
2. Как решить даную задачу?
Спасибо.
  
Наверх
ICQ  
IP записан
 
berezdetsky
1c++ power user
Отсутствует


barba non facit sisadminum

Сообщений: 1986
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Как обойти блокировку таблицы _1SBKTTLC?
Ответ #1 - 18. Сентября 2009 :: 14:01
Печать  
Откажись от UPDATE: http://www.softpoint.ru/article_id339.htm
  

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


I Love YaBB 2!

Сообщений: 347
Зарегистрирован: 25. Июня 2007
Re: Как обойти блокировку таблицы _1SBKTTLC?
Ответ #2 - 18. Сентября 2009 :: 14:02
Печать  
FROM _1SBKTTLC AS ТабБло WITH (INDEX(PK__1SBKTTLC), ROWLOCK, XLOCK,HOLDLOCK)
?
  
Наверх
 
IP записан
 
chicago
Senior Member
****
Отсутствует


1C++, I have nothing to
say more!

Сообщений: 316
Местоположение: Тернополь-Киев
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Как обойти блокировку таблицы _1SBKTTLC?
Ответ #3 - 18. Сентября 2009 :: 16:10
Печать  
berezdetsky писал(а) 18. Сентября 2009 :: 14:01:
Откажись от UPDATE: http://www.softpoint.ru/article_id339.htm

Спасибо, это было бы круто реализовать
Цитата:
...
для каждой из двух таблиц бухгалтерских итогов создается дополнительная пара таблиц, которые объединяются путем общего представления по этим таблицам
...

был бы пример реализации...
  
Наверх
ICQ  
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Как обойти блокировку таблицы _1SBKTTLC?
Ответ #4 - 21. Сентября 2009 :: 04:27
Печать  
chicago писал(а) 18. Сентября 2009 :: 16:10:
berezdetsky писал(а) 18. Сентября 2009 :: 14:01:
Откажись от UPDATE: http://www.softpoint.ru/article_id339.htm

Спасибо, это было бы круто реализовать
Цитата:
...
для каждой из двух таблиц бухгалтерских итогов создается дополнительная пара таблиц, которые объединяются путем общего представления по этим таблицам
...

был бы пример реализации...


вот пример
http://www.1csql.ru/materials/articles/develop.html~bafd447e-bdfd-2e14-40e6-8501...

  
Наверх
 
IP записан
 
classic
Senior Member
****
Отсутствует


I Love YaBB 2!

Сообщений: 330
Местоположение: г. Харьков
Зарегистрирован: 22. Мая 2006
Пол: Мужской
Re: Как обойти блокировку таблицы _1SBKTTLC?
Ответ #5 - 21. Сентября 2009 :: 07:59
Печать  
Интересно. Если удалить таблицу _1SBKTTL и подложить вместо нее View такой же структуры, 1С вылетает при запуске при загрузке 1cpp.dll
  
Наверх
 
IP записан
 
berezdetsky
1c++ power user
Отсутствует


barba non facit sisadminum

Сообщений: 1986
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Как обойти блокировку таблицы _1SBKTTLC?
Ответ #6 - 21. Сентября 2009 :: 08:15
Печать  
classic писал(а) 21. Сентября 2009 :: 07:59:
Интересно. Если удалить таблицу _1SBKTTL и подложить вместо нее View такой же структуры, 1С вылетает при запуске при загрузке 1cpp.dll

1C++ v3.0.1.23 - не вылетает.
  

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


1C++, I have nothing to
say more!

Сообщений: 316
Местоположение: Тернополь-Киев
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Как обойти блокировку таблицы _1SBKTTLC?
Ответ #7 - 21. Сентября 2009 :: 08:42
Печать  
Z1 писал(а) 21. Сентября 2009 :: 04:27:


И где же там пример "отказа от UPDATE"?
  
Наверх
ICQ  
IP записан
 
chicago
Senior Member
****
Отсутствует


1C++, I have nothing to
say more!

Сообщений: 316
Местоположение: Тернополь-Киев
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Как обойти блокировку таблицы _1SBKTTLC?
Ответ #8 - 21. Сентября 2009 :: 08:48
Печать  
classic писал(а) 21. Сентября 2009 :: 07:59:
Интересно. Если удалить таблицу _1SBKTTL и подложить вместо нее View такой же структуры, 1С вылетает при запуске при загрузке 1cpp.dll


А зачем удалять то? Можно:
- оставить таблицу _1SBKTTL;
- сделать свое представление, например "_1SBKTTL_vw";
- поправить в BkEnd.dll все "1SBKTTL" на "_1SBKTTL_vw".
  
Наверх
ICQ  
IP записан
 
berezdetsky
1c++ power user
Отсутствует


barba non facit sisadminum

Сообщений: 1986
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Как обойти блокировку таблицы _1SBKTTLC?
Ответ #9 - 21. Сентября 2009 :: 08:59
Печать  
Не забывай, что её периодически надо будет возвращать обратно для всяких реструктуризаций.  Подмигивание Да и в монопольном режиме этот механизм будет лишним.
  

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


1C++, I have nothing to
say more!

Сообщений: 316
Местоположение: Тернополь-Киев
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Как обойти блокировку таблицы _1SBKTTLC?
Ответ #10 - 21. Сентября 2009 :: 09:19
Печать  
berezdetsky писал(а) 21. Сентября 2009 :: 08:59:
Не забывай, что её периодически надо будет возвращать обратно для всяких реструктуризаций.  Подмигивание Да и в монопольном режиме этот механизм будет лишним.


Как мне видится, модель (для "_1SBKTTL") такова:
- создаем таблицу "_1SBKTTL_ins";
- в хран. проц. "_1sp__1SBKTTL_ChangeTotal" убираем "Update" и все перенапрявляем в "_1SBKTTL_ins" как "INSERT INTO";
- поскольку в "_1SBKTTL" у нас в рабочее время не будет акт. итогов делаем представление "_1SBKTTL_vw". В этом предсталении будут итоги из табл. "_1SBKTTL", но с учетом "_1SBKTTL_vw";
- заменяем в BkEnd.dll все "1SBKTTL" на "_1SBKTTL_vw";
- пишем скрипт, который по шедулеру (в не раб. время) будет переносить все данные из "_1SBKTTL_ins" в "_1SBKTTL".

Все. Да в мон. режиме это все лишнее.
  
Наверх
ICQ  
IP записан
 
classic
Senior Member
****
Отсутствует


I Love YaBB 2!

Сообщений: 330
Местоположение: г. Харьков
Зарегистрирован: 22. Мая 2006
Пол: Мужской
Re: Как обойти блокировку таблицы _1SBKTTLC?
Ответ #11 - 21. Сентября 2009 :: 13:07
Печать  
Как-то неаккуратненько с патчингом длл. Если ты сисадмин и постоянно держишь руку на пульсе - это может быть и прокатит. А продавать патченые длл как готовое решение как-то стремно. Найдется же обязательно шибко умный пользователь, который запустит свою копию 1С - и записи пойдут не в те таблицы.
  
Наверх
 
IP записан
 
chicago
Senior Member
****
Отсутствует


1C++, I have nothing to
say more!

Сообщений: 316
Местоположение: Тернополь-Киев
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Как обойти блокировку таблицы _1SBKTTLC?
Ответ #12 - 21. Сентября 2009 :: 13:59
Печать  
classic писал(а) 21. Сентября 2009 :: 13:07:
Как-то неаккуратненько с патчингом длл. Если ты сисадмин и постоянно держишь руку на пульсе - это может быть и прокатит. А продавать патченые длл как готовое решение как-то стремно. Найдется же обязательно шибко умный пользователь, который запустит свою копию 1С - и записи пойдут не в те таблицы.


Кто мешает (запрещает) написать механизм проверки (верификации) загрузки нужной dll? Так сказать "защиту от дурака" или от "шибко умного пользователя"?
В глоб. модуле, при начеле работы проверка dll, если "не та" - иди кури. В чем вопрос то?
  
Наверх
ICQ  
IP записан
 
classic
Senior Member
****
Отсутствует


I Love YaBB 2!

Сообщений: 330
Местоположение: г. Харьков
Зарегистрирован: 22. Мая 2006
Пол: Мужской
Re: Как обойти блокировку таблицы _1SBKTTLC?
Ответ #13 - 21. Сентября 2009 :: 15:19
Печать  
Звучит логично, нужно экспериментировать.
Насколько упадет производительность после дня активной работы? Это ж таблица _1SBKTTL_ins выростет до огромных размеров.
  
Наверх
 
IP записан
 
classic
Senior Member
****
Отсутствует


I Love YaBB 2!

Сообщений: 330
Местоположение: г. Харьков
Зарегистрирован: 22. Мая 2006
Пол: Мужской
Re: Как обойти блокировку таблицы _1SBKTTLC?
Ответ #14 - 23. Сентября 2009 :: 08:38
Печать  
Не могу сообразить, как написать запрос - объединяющий данные из двух таблиц... Конечно, можно делать копию - view в еще одну таблицу, потом удалить из основной и копировать копию в основную - но такие дела выполняются несколько минут при десятке записей в таблицах движений...
Есть ощущение, что это должно делаться красиво и аккуратно через update, да что-то не выходит каменный цветок.
  
Наверх
 
IP записан
 
alexdd
Senior Member
****
Отсутствует


I Love YaBB 2!

Сообщений: 347
Зарегистрирован: 25. Июня 2007
Re: Как обойти блокировку таблицы _1SBKTTLC?
Ответ #15 - 23. Сентября 2009 :: 10:14
Печать  
Народ, а что это все даст? Это что оптимизация блокировок? Почему тогда _1sbkttl, _1sjourn все равно залочен на все время проведения документа.
Если оптимизация производительности, тоже сомнительно, вместо update - insert в другую таблицу и view, и че от этого будет быстрее?
может я туплю, конечно, но чет нихрена непонимаюУлыбка
  
Наверх
 
IP записан
 
classic
Senior Member
****
Отсутствует


I Love YaBB 2!

Сообщений: 330
Местоположение: г. Харьков
Зарегистрирован: 22. Мая 2006
Пол: Мужской
Re: Как обойти блокировку таблицы _1SBKTTLC?
Ответ #16 - 23. Сентября 2009 :: 10:31
Печать  
alexdd писал(а) 23. Сентября 2009 :: 10:14:
Народ, а что это все даст? Это что оптимизация блокировок? Почему тогда _1sbkttl, _1sjourn все равно залочен на все время проведения документа.
Если оптимизация производительности, тоже сомнительно, вместо update - insert в другую таблицу и view, и че от этого будет быстрее?
может я туплю, конечно, но чет нихрена непонимаюУлыбка

Это все имеет смысл, если ты оключишь блокировки в базе.
Тогда если проводятся 2 разные документа - они не будут натыкаться на журнал документов. НО: велика вероятность того, что им обоим придется обновить одинаковые строки в таблицах kttl, kttlc.
Сейчас часто получается так, что эти строки обновляются неверно, одно из одновременных изменений теряется. 10 + 5 + 5 = 15.
В случае же инсертов (я надеюсь) - подобных потерь быть не должно.
По крайней мере - я это дело уже запустил на боевой базе, для проверки. 60000 строк в таблице движений. Полет нормальный, тормозов не замечено.
  
Наверх
 
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Как обойти блокировку таблицы _1SBKTTLC?
Ответ #17 - 23. Сентября 2009 :: 10:38
Печать  
classic писал(а) 23. Сентября 2009 :: 10:31:
alexdd писал(а) 23. Сентября 2009 :: 10:14:
Народ, а что это все даст? Это что оптимизация блокировок? Почему тогда _1sbkttl, _1sjourn все равно залочен на все время проведения документа.
Если оптимизация производительности, тоже сомнительно, вместо update - insert в другую таблицу и view, и че от этого будет быстрее?
может я туплю, конечно, но чет нихрена непонимаюУлыбка

Это все имеет смысл, если ты оключишь блокировки в базе.
Тогда если проводятся 2 разные документа - они не будут натыкаться на журнал документов. НО: велика вероятность того, что им обоим придется обновить одинаковые строки в таблицах kttl, kttlc.
Сейчас часто получается так, что эти строки обновляются неверно, одно из одновременных изменений теряется. 10 + 5 + 5 = 15.
В случае же инсертов (я надеюсь) - подобных потерь быть не должно.
По крайней мере - я это дело уже запустил на боевой базе, для проверки. 60000 строк в таблице движений. Полет нормальный, тормозов не замечено.

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


alexdd прав видя часть логики трудно оперировать всем.
  
Наверх
 
IP записан
 
alexdd
Senior Member
****
Отсутствует


I Love YaBB 2!

Сообщений: 347
Зарегистрирован: 25. Июня 2007
Re: Как обойти блокировку таблицы _1SBKTTLC?
Ответ #18 - 23. Сентября 2009 :: 10:54
Печать  
То есть блокировка _1sjourn просто отключена? А как быть, например, в такой ситуации:
есть остаток 2 штуки товара. Пользователь 1 проводит документ, списывает 2 штуки. Движения, которые сделал документ пользователя 1 еще не закомичены. Пользователь 2 начинает проводить свой документ, списывает тоже 2 штуки.
"Закомиченные остатки" позволяют провести документы обоим пользователям, блокировки не возникнет. В результате спишется 4 штуки товара?
Стандартная блокировка 1С заблокирует _1sjourn и не даст Пользователю 2 провести свой документ, пока не закончится проведение для Пользователя 1.
  
Наверх
 
IP записан
 
berezdetsky
1c++ power user
Отсутствует


barba non facit sisadminum

Сообщений: 1986
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Как обойти блокировку таблицы _1SBKTTLC?
Ответ #19 - 23. Сентября 2009 :: 11:00
Печать  
alexdd

Разумеется, отключение универсального (но тормозного) механизма 1С должно сопровождаться реализацией собственного, предназначенного для конкретной бизнеслогики (и потому более эффективного).
  

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


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Как обойти блокировку таблицы _1SBKTTLC?
Ответ #20 - 23. Сентября 2009 :: 11:13
Печать  
А никто не думал скажем для сокращения
времени проведения(что бух что торговля) подготавливать
все заранее в ТЗ  а в модуле проведения только проверять остатки
(если нужно ) и делать только движения из ТЗ.
Основная идея в модуле проведения операций меньше он быстрее выполняется и блокировка ( стандартная или своя )
накладывается на меньшее время.

Сложность возникает когда проводим документ из внешней обработке не своей. Либо разделять эти два случая в модуле проведения, либо менять обработку и в ней создавать ТЗ.
  
Наверх
 
IP записан
 
classic
Senior Member
****
Отсутствует


I Love YaBB 2!

Сообщений: 330
Местоположение: г. Харьков
Зарегистрирован: 22. Мая 2006
Пол: Мужской
Re: Как обойти блокировку таблицы _1SBKTTLC?
Ответ #21 - 23. Сентября 2009 :: 11:16
Печать  
alexdd писал(а) 23. Сентября 2009 :: 10:54:
То есть блокировка _1sjourn просто отключена? А как быть, например, в такой ситуации:
есть остаток 2 штуки товара. Пользователь 1 проводит документ, списывает 2 штуки. Движения, которые сделал документ пользователя 1 еще не закомичены. Пользователь 2 начинает проводить свой документ, списывает тоже 2 штуки.
"Закомиченные остатки" позволяют провести документы обоим пользователям, блокировки не возникнет. В результате спишется 4 штуки товара?

В данном случае (особенности националь данного предприятия): вероятность такого очень мала + никаких проблем не будет. Ну спишется 4 штуки, ну и что. Главное, что бы на складе оказалось -2. А то без инсертов бывало, оказывалось 0.
Тоже не страшно, конечно, но, неприятно.
  
Наверх
 
IP записан
 
alexdd
Senior Member
****
Отсутствует


I Love YaBB 2!

Сообщений: 347
Зарегистрирован: 25. Июня 2007
Re: Как обойти блокировку таблицы _1SBKTTLC?
Ответ #22 - 23. Сентября 2009 :: 11:18
Печать  
Понятно, просто показалось, что если возникают случаи, когда
Цитата:
Сейчас часто получается так, что эти строки обновляются неверно, одно из одновременных изменений теряется

то тут как раз и ошибка в логике блокировок, т.е. обновление происходит по одним и тем же измерением(субконто), тут нужно "подождать", а не инсертить в другую таблицу. Хотя, да, зависит, конечно, от бизнеслогики(может там только услуги, например, остатки не важны..хотя все-равно стремно, имхо). Если полет нормальный, то и ладноУлыбка
  
Наверх
 
IP записан
 
alexdd
Senior Member
****
Отсутствует


I Love YaBB 2!

Сообщений: 347
Зарегистрирован: 25. Июня 2007
Re: Как обойти блокировку таблицы _1SBKTTLC?
Ответ #23 - 23. Сентября 2009 :: 11:20
Печать  
classic писал(а) 23. Сентября 2009 :: 11:16:
Главное, что бы на складе оказалось -2.

все, понял
  
Наверх
 
IP записан
 
classic
Senior Member
****
Отсутствует


I Love YaBB 2!

Сообщений: 330
Местоположение: г. Харьков
Зарегистрирован: 22. Мая 2006
Пол: Мужской
Re: Как обойти блокировку таблицы _1SBKTTLC?
Ответ #24 - 02. Октября 2009 :: 06:33
Печать  
Сегодня отключил доп таблицы. За несколько дней, пока эта система работала, пересчет итогов требовался постоянно, причем поймать, из-за чего расчитанные итоги расходились с проводками не удалось. Накладки в штатном режиме (когда просто блокировки отключены) возникали намного реже.
  
Наверх
 
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Как обойти блокировку таблицы _1SBKTTLC?
Ответ #25 - 02. Октября 2009 :: 07:10
Печать  
classic писал(а) 02. Октября 2009 :: 06:33:
Сегодня отключил доп таблицы. За несколько дней, пока эта система работала, пересчет итогов требовался постоянно, причем поймать, из-за чего расчитанные итоги расходились с проводками не удалось. Накладки в штатном режиме (когда просто блокировки отключены) возникали намного реже.

Если уже делать так то нужно в другие таблицы данные переносить.
Тогда в 1с  остатки и обороты будут на время последнего переноса из доп таблиц в родные таблицы.

А если хранить в одной таблице все "расплывается" и при большой нагрузке на базу не отследишь из-за чего.
а при малой нагрузке вообще не стоит этого делать.


  
Наверх
 
IP записан
 
classic
Senior Member
****
Отсутствует


I Love YaBB 2!

Сообщений: 330
Местоположение: г. Харьков
Зарегистрирован: 22. Мая 2006
Пол: Мужской
Re: Как обойти блокировку таблицы _1SBKTTLC?
Ответ #26 - 02. Октября 2009 :: 16:40
Печать  
Нагрузка вроде не маленькая, в таблице движений kttl за день собирался почти миллион строк. Но к сожалению, времени доводить до ума проект нет, да и финансирования тоже. Дешевле просто вернуть все как былоУлыбка
  
Наверх
 
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Как обойти блокировку таблицы _1SBKTTLC?
Ответ #27 - 07. Октября 2009 :: 12:25
Печать  
Я придумал еще один вариант  subj( самый быстрый )
данные то что Вы вносите insert в доп таблицы можно вообще
никуда не вносить.
Т.е. Бух остатки и обороты будут у Вас на какое-то время.
Все что делается после заносится только в проводки.
Также можно либо написать хран. процедуру
по пересчету бух итогов от самой ранней разрешенной даты
либо воспользоваться стандартной обработкой по пересчету бух итогов.
Естественно когда пересчитываем бух итоги нельзя ни проводить документы не отменять их.

Переключать режимы между таким "Супербыстрым" и "стандартным" можно
либо внеся спец. переменные в xp либо перегинирируя сами xp.

Не знаю насколько возможна работа бухгалтерии в таком режиме.

Когда то давно писал тест для регистров пересчет всех rg по ra.
пересчет за 6 лет занял 18 минут ( да и то я не стремился написать супероптимально)
а пересчет двух кварталов займет не больше 3 минут на хорошем сервере.
  
Наверх
 
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Как обойти блокировку таблицы _1SBKTTLC?
Ответ #28 - 07. Октября 2009 :: 13:57
Печать  
PS к 27 Плюс можно также сделать очередь
создаем доп таблицу

Код
Выбрать все
create table last_oper
(
id bigint  IDENTITY(1,1) ,
iddoc	char(9)     NOT NULL,
oper	 tinyint  NOT NULL default 1 , -- 1 проводим документ 0 отменяем проведение документа
data_dt	 datetime    NOT NULL default getdate(),
CONSTRAINT PK_last_oper PRIMARY KEY(id)
-- может быть имеет смысл добавить значение период проведения. НачМесяца(ДатаДок)
)
 



При новом проведении и при отмене документа из модуля проведения добавляем одну
запись в эту таблицу. Получаем очередь на проведение.

Каким либо образом ( задание само запускается через фиксированное время,
тригер на какую то таблицу или даем управлять подтягиванием проведением Пользователю ) обрабатываем эту очередь в порядке возрастания id ( обработанные документы из очереди удаляем )
Все процесс который  занимается этим делом никого не блокирует.
Ведь только он может менять остатки и обороты
Остальные процессы только читают.

Все тоже самое можно сделать и для регистров.
Все это вполне реально сделать(сложность будет может быть только с УРБД ).
  
Наверх
 
IP записан
 
chicago
Senior Member
****
Отсутствует


1C++, I have nothing to
say more!

Сообщений: 316
Местоположение: Тернополь-Киев
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Как обойти блокировку таблицы _1SBKTTLC?
Ответ #29 - 07. Октября 2009 :: 16:59
Печать  
Z1 писал(а) 07. Октября 2009 :: 13:57:
Все это вполне реально сделать(сложность будет может быть только с УРБД ).


Почему? О УРБД еще не думал.
  
Наверх
ICQ  
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Как обойти блокировку таблицы _1SBKTTLC?
Ответ #30 - 07. Октября 2009 :: 17:20
Печать  
chicago писал(а) 07. Октября 2009 :: 16:59:
Z1 писал(а) 07. Октября 2009 :: 13:57:
Все это вполне реально сделать(сложность будет может быть только с УРБД ).


Почему? О УРБД еще не думал.

С ней с УРБД всегда сложности.

Может есть за что зацепиться когда стартует подгрузка УРБД  ?
В этом весь и вопрос.

Сложности с УРБД есть большая вероятность отката всех изменений например документ блокирован кем то.

Далее когда подгружается УРБД то не выполняются модуль проведения ( и модуль отмены проведения документа ).

Если делать чистый 27 то как узнать что самый ранний документ не откатился за период нач константы изменения документов.

Если делать 27+28 то как помещать документы в очередь ?
(ведь модуль проведения не исполняется)

Как возможное из решений перед подгрузкой В sql процеcе подгрузки но уже в транзакции надо выполнить :
1.захватить монопол блокировку на таблицы журнал документов
2.создать (включить) тригер на изменение таблицы журнала документов
3.при срабатывании тригера учитывать 27 и 28

После окончания подгрузки тригер удалить ( или выключить )

Либо вместо всего этого узнавать произошла подгрузка успешно
и самим  анализировать zip файла что же мы подгрузили но
вдруг это не сработает а если 27+28 за время анализа еще попадут другие документы и порядок
очереди будет не такой - что тоже плохо.


  
Наверх
 
IP записан
 
Захар Малиновский
Junior Member
**
Отсутствует


1C++ active user

Сообщений: 53
Местоположение: г. Харьков
Зарегистрирован: 26. Февраля 2009
Re: Как обойти блокировку таблицы _1SBKTTLC?
Ответ #31 - 04. Декабря 2009 :: 11:59
Печать  
classic писал(а) 23. Сентября 2009 :: 10:31:
alexdd писал(а) 23. Сентября 2009 :: 10:14:
Народ, а что это все даст? Это что оптимизация блокировок? Почему тогда _1sbkttl, _1sjourn все равно залочен на все время проведения документа.
Если оптимизация производительности, тоже сомнительно, вместо update - insert в другую таблицу и view, и че от этого будет быстрее?
может я туплю, конечно, но чет нихрена непонимаюУлыбка

Это все имеет смысл, если ты оключишь блокировки в базе.
Тогда если проводятся 2 разные документа - они не будут натыкаться на журнал документов. НО: велика вероятность того, что им обоим придется обновить одинаковые строки в таблицах kttl, kttlc.
Сейчас часто получается так, что эти строки обновляются неверно, одно из одновременных изменений теряется. 10 + 5 + 5 = 15.
В случае же инсертов (я надеюсь) - подобных потерь быть не должно.
По крайней мере - я это дело уже запустил на боевой базе, для проверки. 60000 строк в таблице движений. Полет нормальный, тормозов не замечено.


Если это про расхождение таблиц итогов с суммой по проводкам то вот:
 подобное расхождение таблицы итогов БИ с суммой проводок может быть из-за кода select max(rowid) from 1sentry   в процедуре _1sp__1SENTRY_MaxRowID
Два пользователя могут получить как результат выполнения _1sp__1SENTRY_MaxRowID одинаковые rowid якобы своих новых записей (своих только что сделаных инсертов) в 1sentry.
Т.е. два пользователя все правильно пишут в 1sentry, но один из них меняет итоги по суммам проводок другого пользователя.
Надо код хранимой процедуры _1sp__1SENTRY_MaxRowID менять так чтоб там было READPAST. Пусть игнорируют незаконченные транзакции и считают  RowID _своих_ инсертов в 1sentry максимальным.

  
Наверх
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Как обойти блокировку таблицы _1SBKTTLC?
Ответ #32 - 04. Декабря 2009 :: 12:28
Печать  
(Захар Малиновский) Это ты о каком режиме блокировок говоришь ?
О стандартном или о чем то еще ?
  
Наверх
 
IP записан
 
classic
Senior Member
****
Отсутствует


I Love YaBB 2!

Сообщений: 330
Местоположение: г. Харьков
Зарегистрирован: 22. Мая 2006
Пол: Мужской
Re: Как обойти блокировку таблицы _1SBKTTLC?
Ответ #33 - 04. Декабря 2009 :: 16:19
Печать  
Захар Малиновский Спасибо. Проверю в боевой базе на следующей неделе
  
Наверх
 
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Как обойти блокировку таблицы _1SBKTTLC?
Ответ #34 - 04. Декабря 2009 :: 16:46
Печать  
Цитата:
READPAST. Применяется только к оператору SELECT и только к строкам, блокированным с помощью блокировки на уровне строк. Пропускаются строки, блокированные другими транзакциями, которые обычно включаются в набор результатов; возвращает результаты без этих блокированных строк. Может использоваться только с транзакциями, выполняемыми на уровне изолированности read committed.




Если свои блокировки и READPAST
что будет
пусть сейчас есть макс  id = 10
начали первое проведение из comp1
выставили READPAST
получили следущ id = 11

начали второе  проведение из comp2
выставили READPAST
получили следущ id = 11 ( тот же самый !!!)
Закончилось проведение на первом comp1
Закончилось проведение на втором comp2 -
что при этом произойдет точно не знаю либо откатимся по ошибке либо что-то еще ?

Если я ошибаюсь то поправьте меня.


PS
С помощью двух Предупреждение в модулях проведения
легко смоделировать ситуацию
  
Наверх
 
IP записан
 
chicago
Senior Member
****
Отсутствует


1C++, I have nothing to
say more!

Сообщений: 316
Местоположение: Тернополь-Киев
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Как обойти блокировку таблицы _1SBKTTLC?
Ответ #35 - 07. Декабря 2009 :: 08:25
Печать  
Процедуру "_1sp__1SENTRY_MaxRowID" можно переписать с:
Код
Выбрать все
set nocount on select @i=MAX(ROW_ID) from _1SENTRY(NOLOCK) if @i is null select @i=0 


на
Код
Выбрать все
set nocount on select @i=@@IDENTITY if @i is null select @i=0 

  
Наверх
ICQ  
IP записан
 
Захар Малиновский
Junior Member
**
Отсутствует


1C++ active user

Сообщений: 53
Местоположение: г. Харьков
Зарегистрирован: 26. Февраля 2009
Re: Как обойти блокировку таблицы _1SBKTTLC?
Ответ #36 - 07. Декабря 2009 :: 11:27
Печать  
chicago писал(а) 07. Декабря 2009 :: 08:25:
Процедуру "_1sp__1SENTRY_MaxRowID" можно переписать с:
Код
Выбрать все
set nocount on select @i=MAX(ROW_ID) from _1SENTRY(NOLOCK) if @i is null select @i=0 


на
Код
Выбрать все
set nocount on select @i=@@IDENTITY if @i is null select @i=0 



Так сделать, это себе вовред.  Я ж говорю - ИТОГИ начнут расходиться с суммой проводок. Несколько (два для простоты) подключений пользователей выполняющих код процедуры _1sp__1SENTRY_MaxRowID   _одновременно_  получат ,в твоём случае, rowid последнего , а НЕ СВОЕГО инсерта проводок.
Это если у тебя не более одного документа  одновременно проводится в системе тогда ты прав. Но ты в теме про отключенные стандартные блокировки 1с.
  
Наверх
IP записан
 
chicago
Senior Member
****
Отсутствует


1C++, I have nothing to
say more!

Сообщений: 316
Местоположение: Тернополь-Киев
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Как обойти блокировку таблицы _1SBKTTLC?
Ответ #37 - 07. Декабря 2009 :: 14:03
Печать  
Захар Малиновский писал(а) 07. Декабря 2009 :: 11:27:
chicago писал(а) 07. Декабря 2009 :: 08:25:
Процедуру "_1sp__1SENTRY_MaxRowID" можно переписать с:
Код
Выбрать все
set nocount on select @i=MAX(ROW_ID) from _1SENTRY(NOLOCK) if @i is null select @i=0 


на
Код
Выбрать все
set nocount on select @i=@@IDENTITY if @i is null select @i=0 



Так сделать, это себе вовред.  Я ж говорю - ИТОГИ начнут расходиться с суммой проводок. Несколько (два для простоты) подключений пользователей выполняющих код процедуры _1sp__1SENTRY_MaxRowID   _одновременно_  получат ,в твоём случае, rowid последнего , а НЕ СВОЕГО инсерта проводок.
Это если у тебя не более одного документа  одновременно проводится в системе тогда ты прав. Но ты в теме про отключенные стандартные блокировки 1с.


Дайте пример как можно сделать "себе вовред".

Делаю так:
1. Первая сесия:
Код
Выбрать все
BEGIN TRAN

exec sp_executesql N'Insert into _1SENTRY values( @P1,@P2,...

declare @P1 int
set @P1=0
exec _1sp__1SENTRY_MaxRowID @P1 output
select @P1

--ROLLBACK TRAN 



получаю 412050.

2. Вторая сесия:
Код
Выбрать все
BEGIN TRAN

exec sp_executesql N'Insert into _1SENTRY values( @P1,@P2,...

declare @P1 int
set @P1=0
exec _1sp__1SENTRY_MaxRowID @P1 output
select @P1

--ROLLBACK TRAN 



получаю 412051.

Запись проводок и пересчет итогов идет последовательно:
а).
Код
Выбрать все
exec sp_executesql N'Insert into _1SENTRY values( @P1,@P2,... 


б).
Код
Выбрать все
declare @P1 int
set @P1=0
exec _1sp__1SENTRY_MaxRowID @P1 output
select @P1 


в).
Код
Выбрать все
exec _1sp__1SENTRY_NewEntry... 



Какая вероятность того, что перед пунктом б). сесии №1 "вклинится" пункт а). сесии №2?

Покажите мне как можно сделать так что бы в SQL значение @@IDENTITY получить "НЕ СВОЕГО инсерта" если значения Duration пункта а). в 99% равно 0?

Спасибо.
  
Наверх
ICQ  
IP записан
 
Захар Малиновский
Junior Member
**
Отсутствует


1C++ active user

Сообщений: 53
Местоположение: г. Харьков
Зарегистрирован: 26. Февраля 2009
Re: Как обойти блокировку таблицы _1SBKTTLC?
Ответ #38 - 08. Декабря 2009 :: 13:27
Печать  
Дайте пример как можно сделать "себе вовред".
Запись проводок и пересчет итогов идет последовательно:
а).
Код
Выбрать все
exec sp_executesql N'Insert into _1SENTRY values( @P1,@P2,... 


б).
Код
Выбрать все
declare @P1 int
set @P1=0
exec _1sp__1SENTRY_MaxRowID @P1 output
select @P1 


в).
Код
Выбрать все
exec _1sp__1SENTRY_NewEntry... 



Какая вероятность того, что перед пунктом б). сесии №1 "вклинится" пункт а). сесии №2?

Покажите мне как можно сделать так что бы в SQL значение @@IDENTITY получить "НЕ СВОЕГО инсерта" если значения Duration пункта а). в 99% равно 0?

Спасибо.
[/quote]

Всё дело просто в том что между  а) и пунктом б)  есть  какой-то алгоритм. Т.е. какойто call , ret и еще много чего что может удлиннять промежуток времени между ИНСЕРТОМ и вызовом _1sp__1SENTRY_MaxRowID. А плюс много-задачность на терминальном сервере, приостановка процессов планировщиком.   Вопрос "А какая вероятность что ..." - ну не знаю. _Большая_ вероятность. Ибо такое у меня было.  
Два инсерта в одну и туже таблицу из двух сессий могут быть. и они могут выполниться подряд на скл сервере.
  
Наверх
IP записан
 
Захар Малиновский
Junior Member
**
Отсутствует


1C++ active user

Сообщений: 53
Местоположение: г. Харьков
Зарегистрирован: 26. Февраля 2009
Re: Как обойти блокировку таблицы _1SBKTTLC?
Ответ #39 - 08. Декабря 2009 :: 13:35
Печать  
Chicago, ты в своем примере все сделал в одном пакете (batch).
"
exec sp_executesql N'Insert into _1SENTRY values( @P1,@P2,...
declare @P1 int
set @P1=0
exec _1sp__1SENTRY_MaxRowID @P1 output
select @P1
"
Один batch sql сервер может и не разрывает  операторами из других сессий. Точно не знаю.
На практике же 1с эти две строки отправляет не сервер разными batch.
  
Наверх
IP записан
 
Захар Малиновский
Junior Member
**
Отсутствует


1C++ active user

Сообщений: 53
Местоположение: г. Харьков
Зарегистрирован: 26. Февраля 2009
Re: Как обойти блокировку таблицы _1SBKTTLC?
Ответ #40 - 08. Декабря 2009 :: 13:54
Печать  
Z1 писал(а) 04. Декабря 2009 :: 16:46:
[quote]READPAST. Применяется только к оператору SELECT и только к строкам, блокированным с помощью блокировки на уровне строк. Пропускаются строки, блокированные другими транзакциями, которые обычно включаются в набор результатов; возвращает результаты без этих блокированных строк. Может использоваться только с транзакциями, выполняемыми на уровне изолированности read committed.


Z1, парня с надписью "God member" как то боязно расстраивать Улыбка  , но твой пример я не понял.
Тут надо понять особенность отправки на сервер инсерта в 1entry и  последующего exec __1sp__1sentry_MaxRowID.
Они отправляються на сервер так что между ними сервер скл может вставить операторы других сессий.
Поєтому предлагаеться __1sp__1sentry_MaxRowID приказывать не брать во внимание (т.е. READPAST) сделанные инсерты другими сессиями (пока эти ДРУГИЕ сессии не скажут COMMIT). А ихний COMMIT будет позже нашего select max(rowid) from _1sentry (READPAST) _почти_ точно. А почти это потому что вдруг какой - то код , которого в 1с по стандарту нет, сделает инсерт и СРАЗУ commit. Вот тогда , может быть, нас не спасает READPAST. Но у меня такого нет.


  
Наверх
IP записан
 
chicago
Senior Member
****
Отсутствует


1C++, I have nothing to
say more!

Сообщений: 316
Местоположение: Тернополь-Киев
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Как обойти блокировку таблицы _1SBKTTLC?
Ответ #41 - 08. Декабря 2009 :: 14:41
Печать  
Захар Малиновский писал(а) 08. Декабря 2009 :: 13:35:
ты в своем примере все сделал в одном пакете (batch).
"
exec sp_executesql N'Insert into _1SENTRY values( @P1,@P2,...
declare @P1 int
set @P1=0
exec _1sp__1SENTRY_MaxRowID @P1 output
select @P1
"
Один batch sql сервер может и не разрывает  операторами из других сессий. Точно не знаю.
На практике же 1с эти две строки отправляет не сервер разными batch.


Да, в одном пакете.

Покажите мне в профайлере пример (доказательство) когда "на практике же 1с эти две строки отправляет не сервер разными batch" конструкции "Операция.Записать()".

Как мы можем утверждать о большой вероятности того что мы сами не можем сэмулировать экспериментально?
  
Наверх
ICQ  
IP записан
 
Переключение на Главную Страницу Страницы: [1] 
ОтправитьПечать