Переключение на Главную Страницу Страницы: [1]  ОтправитьПечать
Очень популярная тема (более 25 ответов) Как обрабатывают транзакции во взрослых системах? (число прочтений - 6741 )
JohnyDeath
1c++ power user
1c++ donor
Отсутствует



Сообщений: 3050
Местоположение: Волгоград
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Как обрабатывают транзакции во взрослых системах?
20. Августа 2010 :: 06:43
Печать  
Как известно, 1С 7.7 если напарывается на заблокированную табличку, то начинает гонять цикл с попыткой записать в эту табличку. Что-то типа:
Код
Выбрать все
флЗаписали=0;
Пока флЗаписали=0 Цикл
   Попытка
	ЗаписатьДанные();
	флЗаписали=1;
   Исключение
   КонецПопытки;
КонецЦикла 



А как нужно делать правильно? Тот же цикл, но еще добавить "засыпание" системы в исключении?
  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Как обрабатывают транзакции во взрослых системах?
Ответ #1 - 20. Августа 2010 :: 07:02
Печать  
Луше ничего не делать..
В своё время ПБ-ники использовали такую конструкцию, воткнутую в исключение (в конфах с МОД-ом):

Код
Выбрать все
Стр=ТекущееВремя();
Пока Стр=ТекущееВремя() Цикл
КонецЦикла; 



что приводило к 100% загрузке проца только одним пользователем.

После убирания этой шняги  - всё "полетело"
  
Наверх
 
IP записан
 
JohnyDeath
1c++ power user
1c++ donor
Отсутствует



Сообщений: 3050
Местоположение: Волгоград
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Как обрабатывают транзакции во взрослых системах?
Ответ #2 - 20. Августа 2010 :: 07:06
Печать  
В каком смысле "ничего не делать"? Вообще без цикла? Одна попытка??
  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Как обрабатывают транзакции во взрослых системах?
Ответ #3 - 20. Августа 2010 :: 07:14
Печать  
нет, оставить как у тебя и не втыкать никакую паузу.
  
Наверх
 
IP записан
 
JohnyDeath
1c++ power user
1c++ donor
Отсутствует



Сообщений: 3050
Местоположение: Волгоград
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Как обрабатывают транзакции во взрослых системах?
Ответ #4 - 20. Августа 2010 :: 07:21
Печать  
И всё-таки... Как разруливают эту ситуацию в нормальных системах?
  
Наверх
 
IP записан
 
Salimbek
God Member
*****
Отсутствует



Сообщений: 862
Зарегистрирован: 06. Июня 2006
Пол: Мужской
Re: Как обрабатывают транзакции во взрослых системах?
Ответ #5 - 20. Августа 2010 :: 07:33
Печать  
Эм-м-м, трехзвенную систему не предлагать?
  
Наверх
ICQ  
IP записан
 
JohnyDeath
1c++ power user
1c++ donor
Отсутствует



Сообщений: 3050
Местоположение: Волгоград
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Как обрабатывают транзакции во взрослых системах?
Ответ #6 - 20. Августа 2010 :: 07:39
Печать  
Клиент кидает на "сервер приложения" данные, которые надо записать. (клиент работает дальше)
Сервер приложения ставит эту заявку в очередь на запись в сервер БД.
Так?

Да, так, конечно, красиво, но как поступают с 2-мя звеньям?
  
Наверх
 
IP записан
 
berezdetsky
1c++ power user
Отсутствует


barba non facit sisadminum

Сообщений: 1986
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Как обрабатывают транзакции во взрослых системах?
Ответ #7 - 20. Августа 2010 :: 07:46
Печать  
Да примерно так же, как в 1С. Только ожидание блокировки ресурса не загружает процессор. Тебе это в 1С нужно?
  

пароль как коньяк, чем больше звездочек, тем лучше
Наверх
IP записан
 
JohnyDeath
1c++ power user
1c++ donor
Отсутствует



Сообщений: 3050
Местоположение: Волгоград
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Как обрабатывают транзакции во взрослых системах?
Ответ #8 - 20. Августа 2010 :: 08:05
Печать  
А как сделать так, чтобы ожидание разблокировки не грузило процессор?

Я сейчас пытаюсь сделать логгирование изменений. События записи объектов пишутся во внешнюю базу sqlite.
Пока сделал так:
Код
Выбрать все
Пока 0=0 Цикл
Попытка
  ЗаписатьДанные();
  прервать;
Исключение
  Система.Уснуть(10);
КонецПопытки;
КонецЦикла 


Но чё-т не нравится..
  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Как обрабатывают транзакции во взрослых системах?
Ответ #9 - 20. Августа 2010 :: 08:12
Печать  
выстави всем время ожидание захвата таблиц в 0, и оставь код как в (0) ... и проверь.
  
Наверх
 
IP записан
 
JohnyDeath
1c++ power user
1c++ donor
Отсутствует



Сообщений: 3050
Местоположение: Волгоград
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Как обрабатывают транзакции во взрослых системах?
Ответ #10 - 20. Августа 2010 :: 08:15
Печать  
У меня ж внешняя СУБД. Как время ожидание захвата таблиц 1С может на это повлиять?

Ну и попутно. Если всем поставлю этот параметр = 0, то им же будет сразу вываливать ошибку транзакции при записи/проведении.
  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Как обрабатывают транзакции во взрослых системах?
Ответ #11 - 20. Августа 2010 :: 08:21
Печать  
Зато не будет 100% загрузки проца никогда.
ЗЫ: + я ж не знаю, в какой момент ты эту запись делаешь..
  
Наверх
 
IP записан
 
Salimbek
God Member
*****
Отсутствует



Сообщений: 862
Зарегистрирован: 06. Июня 2006
Пол: Мужской
Re: Как обрабатывают транзакции во взрослых системах?
Ответ #12 - 20. Августа 2010 :: 08:29
Печать  
JohnyDeath писал(а) 20. Августа 2010 :: 08:15:
У меня ж внешняя СУБД. Как время ожидание захвата таблиц 1С может на это повлиять?

Ну и попутно. Если всем поставлю этот параметр = 0, то им же будет сразу вываливать ошибку транзакции при записи/проведении.

Цитата:
События записи объектов пишутся во внешнюю базу sqlite.

Хм... вроде она не предназначена для одновременной записи в таблицы, так что рекомендовал бы сделать на манер трехзвенной архитектуры при помощи Робота на сервере. Т.е. клиенты пишут в таблицы с именами "ИмяПользователя", а потом передают эту информацию Роботу (например пишут в справочник "Лог"), а робот по обработке ожидания если находит там информацию, то переносит данные из пользовательских таблиц в общую.
  
Наверх
ICQ  
IP записан
 
JohnyDeath
1c++ power user
1c++ donor
Отсутствует



Сообщений: 3050
Местоположение: Волгоград
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Как обрабатывают транзакции во взрослых системах?
Ответ #13 - 20. Августа 2010 :: 08:41
Печать  
Да, sqlite изначально как бы не предназначена для таких целей. Но сейчас я просто хочу понять как это делается. Что поменялось бы если б я использовал MS SQL Server?
Робот - да, вариант. Но тогда он и записи из таблиц 1С должен удалять (я вообще не хочу, чтобы база 1С разбухала ненужными данными)
  
Наверх
 
IP записан
 
artbear
1c++ developer
1c++ moderator
Отсутствует


Эх, дайте что-нибудь новенькое
да полезное потести

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Как обрабатывают транзакции во взрослых системах?
Ответ #14 - 20. Августа 2010 :: 09:06
Печать  
Вроде Саша Орефков b/или romix делали свои ВК, которые решали проблему загрузки проца.
  

OpenConf developer :: http://openconf.1cpp.ru&&FormEx developer :: http://formex.dorex.ru&&1C++ active developer && tester :: www.1cpp.ru
Наверх
GTalkSkype/VoIPICQ  
IP записан
 
JohnyDeath
1c++ power user
1c++ donor
Отсутствует



Сообщений: 3050
Местоположение: Волгоград
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Как обрабатывают транзакции во взрослых системах?
Ответ #15 - 20. Августа 2010 :: 09:13
Печать  
Да я ж вообще не про то.
Давайте отвлечемся от 1С. Создаем свою Систему, которая тоже пишет некие данные в СУБД MS SQL.
Как я должен разрулить проблемы транзакций в своей новой системе, не используя промежуточное звено?
  
Наверх
 
IP записан
 
Salimbek
God Member
*****
Отсутствует



Сообщений: 862
Зарегистрирован: 06. Июня 2006
Пол: Мужской
Re: Как обрабатывают транзакции во взрослых системах?
Ответ #16 - 20. Августа 2010 :: 09:20
Печать  
artbear писал(а) 20. Августа 2010 :: 09:06:
Вроде Саша Орефков b/или romix делали свои ВК, которые решали проблему загрузки проца.

Там делалась замена цикла на sleep. Для автора можно и так, тем более он в первом посту так и планирует Цитата:
но еще добавить "засыпание" системы в исключении

Через Система.Уснуть(100); загрузки процессора не будет. Вот, например, как было у меня в конфе от Астор-а:
Код
Выбрать все
Процедура Ждать(Секунд,НомерПопытки,НомерСерии,Сост) Экспорт
	Для С=1 По Секунд Цикл
		Вр=ТекущееВремя();
		Состояние(Строка(Секунд-С+1)+" Пауза перед попыткой №"+НомерПопытки+" серия "+НомерСерии+" ("+Сост+")");
		Пока Вр=ТекущееВремя() Цикл КонецЦикла;
	КонецЦикла;
КонецПроцедуры
 


Сейчас так:
Код
Выбрать все
Процедура Ждать(Секунд,НомерПопытки,НомерСерии,Сост) Экспорт
	ПД_СохранитьЛог();
	Для С=1 По Секунд Цикл
		Состояние(Строка(Секунд-С+1)+" Пауза перед попыткой №"+НомерПопытки+" серия "+НомерСерии+" ("+Сост+")");
		глСервис.Уснуть(1000);
	КонецЦикла;
КонецПроцедуры
 

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



Сообщений: 862
Зарегистрирован: 06. Июня 2006
Пол: Мужской
Re: Как обрабатывают транзакции во взрослых системах?
Ответ #17 - 20. Августа 2010 :: 09:28
Печать  
JohnyDeath писал(а) 20. Августа 2010 :: 09:13:
Да я ж вообще не про то.
Давайте отвлечемся от 1С. Создаем свою Систему, которая тоже пишет некие данные в СУБД MS SQL.
Как я должен разрулить проблемы транзакций в своей новой системе, не используя промежуточное звено?

Так ведь для этого и используется время ожидания захвата таблиц. Т.е. запрос ушел на сервер, если сервер не может обработать данные, то они стоят в очереди. При простаивании больше некоторого времени - происходит отказ в выполнении запроса. Таким образом решить проблему можно несколькими путями:
1) Трехзвенка, тогда пишет лишь один процесс
2) Изменение режима блокировки, чтобы блокировалась не таблица целиком, а только строка
3) Сокращение времени на запись в таблицу (например не расчет каждый раз новой строки, и после этого запись, а создание, например, временной таблицы на сервере, запись туда значений и вызов хранимой процедуры для быстрой записи)
можно наверно еще что-то придумать...
  
Наверх
ICQ  
IP записан
 
berezdetsky
1c++ power user
Отсутствует


barba non facit sisadminum

Сообщений: 1986
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Как обрабатывают транзакции во взрослых системах?
Ответ #18 - 20. Августа 2010 :: 09:33
Печать  
JohnyDeath писал(а) 20. Августа 2010 :: 08:41:
Да, sqlite изначально как бы не предназначена для таких целей. Но сейчас я просто хочу понять как это делается. Что поменялось бы если б я использовал MS SQL Server?

Там есть способы рулить этим процессом. К примеру, ожидание блокировки процедурой sp_getapplock не занимает процессор.
  

пароль как коньяк, чем больше звездочек, тем лучше
Наверх
IP записан
 
JohnyDeath
1c++ power user
1c++ donor
Отсутствует



Сообщений: 3050
Местоположение: Волгоград
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Как обрабатывают транзакции во взрослых системах?
Ответ #19 - 20. Августа 2010 :: 10:15
Печать  
berezdetsky писал(а) 20. Августа 2010 :: 09:33:
JohnyDeath писал(а) 20. Августа 2010 :: 08:41:
Да, sqlite изначально как бы не предназначена для таких целей. Но сейчас я просто хочу понять как это делается. Что поменялось бы если б я использовал MS SQL Server?

Там есть способы рулить этим процессом. К примеру, ожидание блокировки процедурой sp_getapplock не занимает процессор.

А можешь прям на пальцах показать как это делается для вставки записей в одну табличку?

Или расскажите как сделать так, чтобы блокировалась одна запись, а не вся табличка в MS SQL.

СтоИт MS SQL Server 2008 express with Adv. На него планирую перегонять некоторые данные роботом-автоматом из 1С для последующего построения OLAP кубиков, ну и логгирование изменений можно (скорее даже нужно) перетащить туда.
Вот только знаний пока не хватает. Поэтому при му в дар любую помощь по просветлению.
  
Наверх
 
IP записан
 
berezdetsky
1c++ power user
Отсутствует


barba non facit sisadminum

Сообщений: 1986
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Как обрабатывают транзакции во взрослых системах?
Ответ #20 - 20. Августа 2010 :: 10:34
Печать  
JohnyDeath писал(а) 20. Августа 2010 :: 10:15:
А можешь прям на пальцах показать как это делается для вставки записей в одну табличку?

Или расскажите как сделать так, чтобы блокировалась одна запись, а не вся табличка в MS SQL.


Ну, если только вставка, то можно особо и не заморачиваться.. А так, не зная в точности, что нужно, посоветовал бы пройтись в указателе BOL по словам "блокировки" и "транзакции". BOL у 2008 - на русском.

Про одну запись - есть хинт rowlock. Ну и эскалацию блокировок придумали не для того, чтобы кому-то сделать хуже.  Подмигивание
  

пароль как коньяк, чем больше звездочек, тем лучше
Наверх
IP записан
 
JohnyDeath
1c++ power user
1c++ donor
Отсутствует



Сообщений: 3050
Местоположение: Волгоград
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Как обрабатывают транзакции во взрослых системах?
Ответ #21 - 20. Августа 2010 :: 10:50
Печать  
как раз сейчас и читаю про блокировки и транзакции в компоненте Database Engine, но чё-т туговато доходит  Нерешительный и непонятно самое главное как и где это применять.
А если только вставка, то там автоматом идет блокировка записи?
  
Наверх
 
IP записан
 
berezdetsky
1c++ power user
Отсутствует


barba non facit sisadminum

Сообщений: 1986
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Как обрабатывают транзакции во взрослых системах?
Ответ #22 - 20. Августа 2010 :: 11:03
Печать  
Да, но, если блокировок слишком много, сервер может повышать степень гранулярности блокировок (Lock Escalation в английском BOL). Этот механизм автоматический, влиять на него можно указанием хинтов.

Если чё, на блокировки ресурсов приложения (sp_getapplock, sp_releaseapplock) механизм эскалации не влияет.
  

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


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Как обрабатывают транзакции во взрослых системах?
Ответ #23 - 20. Августа 2010 :: 11:12
Печать  
JohnyDeath писал(а) 20. Августа 2010 :: 10:50:
как раз сейчас и читаю про блокировки и транзакции в компоненте Database Engine, но чё-т туговато доходит  Нерешительный и непонятно самое главное как и где это применять.
А если только вставка, то там автоматом идет блокировка записи?


(JohnyDeath) читал статью
http://www.rsdn.ru/article/db/mssqllocks.xml

Если у тебя уникальный кластерный индекс на таблице
( например по полю Id bigint  IDENTITY(1,1) )
и эту таблицу ты пишешь
а остальные только читают как (nolock) ( или читают без хинтов блокирования)  то у тебя при insert
будет только блокировка key на строку и записи с разный процессов будут записываться паралельно.
  
Наверх
 
IP записан
 
JohnyDeath
1c++ power user
1c++ donor
Отсутствует



Сообщений: 3050
Местоположение: Волгоград
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Как обрабатывают транзакции во взрослых системах?
Ответ #24 - 20. Августа 2010 :: 11:28
Печать  
Всем спасибо.
Z1, статья самое оно. Вот только думаю, не поменялось ли что-то в 2005-2008 сервере в этом плане.


Позвольте всем задать еще один вопрос, который меня дано мучает.
Как говорил выше, хочу некоторые данные из файловой 1С перекидывать на SQL Server. Только не пойму как выявлять обновленные/новые записи. Например, хочу перекидывать данные таблицы движения регистра.
сейчас вижу только два пути:
1. перекидывать всю таблицу, предварительно очищая старую
2. Если будут перекидваться только движения регистров, то можно добавить реквизит регистра, куда будет пихаться дата последнего обновления записи. Но такая схема применима только для регистра, да и править конфу надо.
Есть еще одни, на мой взгляд самый удачный, способ - использовать перехватчик событий ПослеЗаписи и Обработка проведений. Но на текущий момент ПослеЗаписи не перехватывается, а перехват проведения - валит 1С  Печаль

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


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Как обрабатывают транзакции во взрослых системах?
Ответ #25 - 20. Августа 2010 :: 11:50
Печать  
помяняться не может это базовые понятия.

В sql2005 расширилось появились дополнительно
версионные блокировки. Т.е. режим моментальных снимков,
но судя по описанию для subj  это не нужно.
  
Наверх
 
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Как обрабатывают транзакции во взрослых системах?
Ответ #26 - 20. Августа 2010 :: 11:54
Печать  
по поводу #24

сделай для своей файловой УРБД
переферийная база ms sql
на изменяемые таблицы пиши тригеры которые будут куда либо складывать изменения
  
Наверх
 
IP записан
 
JohnyDeath
1c++ power user
1c++ donor
Отсутствует



Сообщений: 3050
Местоположение: Волгоград
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Как обрабатывают транзакции во взрослых системах?
Ответ #27 - 20. Августа 2010 :: 12:02
Печать  
УРБД нету.
  
Наверх
 
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Как обрабатывают транзакции во взрослых системах?
Ответ #28 - 20. Августа 2010 :: 12:17
Печать  
JohnyDeath писал(а) 20. Августа 2010 :: 12:02:
УРБД нету.

так в чем проблема? я же тебе предложил вариант решения.
Одно дело это решение тебя не устраивает а другое дело что
отсутсnвие УРБД останавливает от такого решения.
  
Наверх
 
IP записан
 
JohnyDeath
1c++ power user
1c++ donor
Отсутствует



Сообщений: 3050
Местоположение: Волгоград
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Как обрабатывают транзакции во взрослых системах?
Ответ #29 - 20. Августа 2010 :: 12:41
Печать  
Решение очень хорошее. В сегодняшнем прайсе от 1С его стоимость составляет 30000 руб. Думаю, что приобрести стОит. Тем более планируется обмен с доп офисами, которые скоро должны открыться.
  
Наверх
 
IP записан
 
berezdetsky
1c++ power user
Отсутствует


barba non facit sisadminum

Сообщений: 1986
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Как обрабатывают транзакции во взрослых системах?
Ответ #30 - 20. Августа 2010 :: 13:02
Печать  
JohnyDeath писал(а) 20. Августа 2010 :: 11:28:
Как говорил выше, хочу некоторые данные из файловой 1С перекидывать на SQL Server. Только не пойму как выявлять обновленные/новые записи. Например, хочу перекидывать данные таблицы движения регистра.

Есть поле verstamp в журнале и в справочниках.
  

пароль как коньяк, чем больше звездочек, тем лучше
Наверх
IP записан
 
JohnyDeath
1c++ power user
1c++ donor
Отсутствует



Сообщений: 3050
Местоположение: Волгоград
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Как обрабатывают транзакции во взрослых системах?
Ответ #31 - 20. Августа 2010 :: 13:15
Печать  
Да, про это тоже помню. Но в таком случае очень заморочено всё получится
  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Как обрабатывают транзакции во взрослых системах?
Ответ #32 - 20. Августа 2010 :: 13:31
Печать  
berezdetsky писал(а) 20. Августа 2010 :: 13:02:
Есть поле verstamp в журнале и в справочниках.


На инфостарте есть даже это, по этому поводу :
http://infostart.ru/public/19007/?PAGEN_1=2#comm
  
Наверх
 
IP записан
 
Переключение на Главную Страницу Страницы: [1] 
ОтправитьПечать