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


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

Сообщений: 316
Местоположение: Тернополь-Киев
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Как обойти блокировку таблиц итогов по регистрам RG####?
23. Сентября 2009 :: 12:08
Печать  
Типа продолжение.

Есть:
1. 1С SQL 7.70.0.25.
2. Microsoft SQL Server  2000 - 8.00.2055 (Intel X86).
3. В процесе разработки собственного механизма блокировок возникла следующая проблемма. Необходимо при проведении документа который участвует в опер. учете (формирует движения по регистрам) разработать механизм исключающий взаимоблокировки.

Взаимоблокировки возникают при вызове хран. процедур вида "_1sp_RG####_Change" где есть тот же "Update RG####".

Спасибо.
  
Наверх
ICQ  
IP записан
 
classic
Senior Member
****
Отсутствует


I Love YaBB 2!

Сообщений: 330
Местоположение: г. Харьков
Зарегистрирован: 22. Мая 2006
Пол: Мужской
Re: Как обойти блокировку таблиц итогов по регистрам RG####?
Ответ #1 - 23. Сентября 2009 :: 13:29
Печать  
Да наверное точно так же, как и с бухитогами. Принципиальной разницы-то нет.

Как быстро потом таблицы сливать - вот вопросУлыбка
  
Наверх
 
IP записан
 
berezdetsky
1c++ power user
Отсутствует


barba non facit sisadminum

Сообщений: 1986
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Как обойти блокировку таблиц итогов по регистрам RG####?
Ответ #2 - 23. Сентября 2009 :: 13:42
Печать  
Принципиальная разница как раз есть - у регистров всё гораздо проще и с UPDATE бороться не нужно.

Как-то вы странно к вопросу подходите..  Озадачен
  

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


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Как обойти блокировку таблиц итогов по регистрам RG####?
Ответ #3 - 23. Сентября 2009 :: 13:43
Печать  
classic писал(а) 23. Сентября 2009 :: 13:29:
Да наверное точно так же, как и с бухитогами. Принципиальной разницы-то нет.

Как быстро потом таблицы сливать - вот вопросУлыбка

1.И чего когда сливать будете откуда и куда таблицы тоже надо блокировать.
2.Как считать остатки между этими событиями когда данные в двух
таблицах.Все запросы переписывать через новый способ.
  
Наверх
 
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Как обойти блокировку таблиц итогов по регистрам RG####?
Ответ #4 - 23. Сентября 2009 :: 13:45
Печать  
Да и не панацея избавиться от блокировок,
в целом это в принципе невозможно,
а задача их правильно устанавливать.
  
Наверх
 
IP записан
 
chicago
Senior Member
****
Отсутствует


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

Сообщений: 316
Местоположение: Тернополь-Киев
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Как обойти блокировку таблиц итогов по регистрам RG####?
Ответ #5 - 23. Сентября 2009 :: 13:54
Печать  
classic писал(а) 23. Сентября 2009 :: 13:29:
Да наверное точно так же, как и с бухитогами. Принципиальной разницы-то нет.

Как быстро потом таблицы сливать - вот вопросУлыбка


Идея как сливать бух. итоги уже реализована (конечно в тест. варианте). Если интересно могу поделиться.
Насчет опер. итогов думаю будет что то аналогичное.
  
Наверх
ICQ  
IP записан
 
chicago
Senior Member
****
Отсутствует


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

Сообщений: 316
Местоположение: Тернополь-Киев
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Как обойти блокировку таблиц итогов по регистрам RG####?
Ответ #6 - 23. Сентября 2009 :: 13:56
Печать  
berezdetsky писал(а) 23. Сентября 2009 :: 13:42:
Принципиальная разница как раз есть - у регистров всё гораздо проще и с UPDATE бороться не нужно.

Как-то вы странно к вопросу подходите..  Озадачен


Это как же, как раз проблема с UPDATE и имеет место. Два документа по одним и тем же измерениям, по одному и тому же периоду "хотят" проапдейтить итог. Взаимоблокировка не избежна... Или я чего то не понимаю?
  
Наверх
ICQ  
IP записан
 
chicago
Senior Member
****
Отсутствует


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

Сообщений: 316
Местоположение: Тернополь-Киев
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Как обойти блокировку таблиц итогов по регистрам RG####?
Ответ #7 - 23. Сентября 2009 :: 14:08
Печать  
Z1 писал(а) 23. Сентября 2009 :: 13:43:
1.И чего когда сливать будете откуда и куда таблицы тоже надо блокировать.
2.Как считать остатки между этими событиями когда данные в двух
таблицах.Все запросы переписывать через новый способ.


Есть такой вариант:
1. В таб. "RG" добавить два поля:
а).
Код
Выбрать все
[ROW_ID] [int] IDENTITY(1,1) NOT NULL 

.
б).
Код
Выбрать все
[FlaIns] [tinyint] NOT NULL CONSTRAINT [DF_RG####_FlaIns]  DEFAULT (0) 

это признак того что это "не апдейт", а "инсет" итог. Который необходимо свернуть.
2. Также в таблице "RG" изменить индекс (добавить в него поле [ROW_ID]).
3. Изменить текст хр. проц. "_1sp_RG####_Change на
Код
Выбрать все
insert into RG#### values(@per,@p1,@p2, ..., 1) 

, где 1 это значение поля [FlaIns].
4. Периодически "сворачивать" итоги.
При этом итоги считаються в он лайн (тоисть в период между сворачиванием) без дополнительных затрат.

Как?

« Последняя редакция: 23. Сентября 2009 :: 15:36 - chicago »  
Наверх
ICQ  
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Как обойти блокировку таблиц итогов по регистрам RG####?
Ответ #8 - 23. Сентября 2009 :: 14:08
Печать  
chicago писал(а) 23. Сентября 2009 :: 13:56:
berezdetsky писал(а) 23. Сентября 2009 :: 13:42:
Принципиальная разница как раз есть - у регистров всё гораздо проще и с UPDATE бороться не нужно.

Как-то вы странно к вопросу подходите..  Озадачен


Это как же, как раз проблема с UPDATE и имеет место. Два документа по одним и тем же измерениям, по одному и тому же периоду "хотят" проапдейтить итог. Взаимоблокировка не избежна... Или я чего то не понимаю?


Что то ты не того говоришь
Ситуация1
Есть Док1 в нем товар1 склад1 приход +100
Есть Док2 в нем товар1 склад1 приход +300
Начинаем их одновременно проводить
Пусть Док1 начал раньше
1. update rg +100
2.Пока не закончиться транзакция по Док1 Док2
ждет для update по блокировке индекса
3.Док1 завершили
4.Док2 делает Док2 + 300
Все ок
никаких взаимоблокировок нет в принципе

Единстевенное но
в rg нет этого движения
1. док1 начинает делать update
update не удалось
2. док2 начинает делать update
update не удалось
3. док1 делает insert все ок
4док2 делает insert и вываливается по ошибке так как индекс не уникальный.
  
Наверх
 
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Как обойти блокировку таблиц итогов по регистрам RG####?
Ответ #9 - 23. Сентября 2009 :: 14:13
Печать  
Ситуация2
Есть Док1 в нем
товар1 склад1 приход +100
товар2 склад1 приход +100

Есть Док2 в нем
товар2 склад1 приход +300
товар1 склад1 приход +300
Начинаем их одновременно проводить
Пусть Док1 начал раньше
1. update rg +100 товар1 в док1 по первой строке
2. update rg +300 товар2 в док2 по первой строке
3. update rg +100 товар2 в док1 по второй строке
взаимоблокировка с 1 ждем освобождения 1
4. update rg +300 товар1 в док1 по второй строке
взаимоблокировка с 2 ждем освобождения 2
3 и 4 вместе дают взаимоблокировку
  
Наверх
 
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Как обойти блокировку таблиц итогов по регистрам RG####?
Ответ #10 - 23. Сентября 2009 :: 14:19
Печать  
(chicago)
пост 7 не осилил.
также не понятно о каких таблицах речь о доп таблицах
или о родных 1с.
  
Наверх
 
IP записан
 
classic
Senior Member
****
Отсутствует


I Love YaBB 2!

Сообщений: 330
Местоположение: г. Харьков
Зарегистрирован: 22. Мая 2006
Пол: Мужской
Re: Как обойти блокировку таблиц итогов по регистрам RG####?
Ответ #11 - 23. Сентября 2009 :: 14:54
Печать  
chicago писал(а) 23. Сентября 2009 :: 13:54:
Идея как сливать бух. итоги уже реализована (конечно в тест. варианте). Если интересно могу поделиться.

Поделись, если не жалко. А то я совсем в лоб задачу решил. В целом надежно, но долго работает.

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


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

Сообщений: 316
Местоположение: Тернополь-Киев
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Как обойти блокировку таблиц итогов по регистрам RG####?
Ответ #12 - 23. Сентября 2009 :: 16:05
Печать  
Z1 писал(а) 23. Сентября 2009 :: 14:08:
Что то ты не того говоришь
Ситуация1
Есть Док1 в нем товар1 склад1 приход +100
Есть Док2 в нем товар1 склад1 приход +300
Начинаем их одновременно проводить
Пусть Док1 начал раньше
1. update rg +100
2.Пока не закончиться транзакция по Док1 Док2
ждет для update по блокировке индекса
3.Док1 завершили
4.Док2 делает Док2 + 300
Все ок
никаких взаимоблокировок нет в принципе

Единстевенное но
в rg нет этого движения
1. док1 начинает делать update
update не удалось
2. док2 начинает делать update
update не удалось
3. док1 делает insert все ок
4док2 делает insert и вываливается по ошибке так как индекс не уникальный.


1. Да все это как раз и делается, что бы Док2 "не ждал" завершения транзакции Док1 (это о Ситуации1), а мог проводится паралельно с Док1 ибо таких "Док2" может быть весьма не мало.
2. На счет "все ок никаких взаимоблокировок нет в принципе" немогу согласиться, но спорить не буду.

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


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

Сообщений: 316
Местоположение: Тернополь-Киев
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Как обойти блокировку таблиц итогов по регистрам RG####?
Ответ #13 - 23. Сентября 2009 :: 16:09
Печать  
Z1 писал(а) 23. Сентября 2009 :: 14:19:
(chicago)
пост 7 не осилил.
также не понятно о каких таблицах речь о доп таблицах
или о родных 1с.


А я вопрос не "осилил" где в моем посте №7 идет речь о "доп таблицах"? Озадачен
Речь идет только о "родных 1с" таблицах.
  
Наверх
ICQ  
IP записан
 
chicago
Senior Member
****
Отсутствует


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

Сообщений: 316
Местоположение: Тернополь-Киев
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Как обойти блокировку таблиц итогов по регистрам RG####?
Ответ #14 - 23. Сентября 2009 :: 16:26
Печать  
classic писал(а) 23. Сентября 2009 :: 14:54:
Поделись, если не жалко. А то я совсем в лоб задачу решил. В целом надежно, но долго работает.


Пожалуйста
Код
Выбрать все
BEGIN TRAN

SET NOCOUNT ON
SET LOCK_TIMEOUT 500
DECLARE @РезБло smallint
SELECT @РезБло = 1
FROM dbo._1SBKTTLC AS ТабБло WITH (TABLOCKX, HOLDLOCK)
IF @РезБло <> 1
ROLLBACK TRAN
DECLARE @DATE_Ins DATETIME
DECLARE @ACCDTID_Ins CHAR(9)
DECLARE @ACCKTID_Ins CHAR(9)
DECLARE @CURRID_Ins CHAR(9)
DECLARE @KIND_Ins CHAR(1)
DECLARE @OB1_Ins NUMERIC(14, 4)
DECLARE @OB2_Ins NUMERIC(14, 4)
DECLARE @OB3_Ins NUMERIC(14, 4)
DECLARE @DTFLAGS_Ins TINYINT
DECLARE @KTFLAGS_Ins TINYINT
DECLARE TabCur CURSOR FOR
	SELECT
		DATE
		, ACCDTID
		, ACCKTID
		, CURRID
		, KIND
		, SUM(OB1) AS OB1
		, SUM(OB2) AS OB2
		, SUM(OB3) AS OB3
		, DTFLAGS
		, KTFLAGS
	FROM dbo._1SBKTTLC_Ins AS _1SBKTTLC_Ins WITH (TABLOCKX, HOLDLOCK)
	GROUP BY
		DATE
		, ACCDTID
		, ACCKTID
		, CURRID
		, KIND
		, DTFLAGS
		, KTFLAGS
	HAVING
		(SUM(OB1) <> 0) OR
        (SUM(OB2) <> 0) OR
        (SUM(OB3) <> 0)
OPEN TabCur
WHILE @@FETCH_STATUS = 0
BEGIN
	FETCH NEXT FROM TabCur INTO
	@DATE_Ins
	, @ACCDTID_Ins
	, @ACCKTID_Ins
	, @CURRID_Ins
	, @KIND_Ins
	, @OB1_Ins
	, @OB2_Ins
	, @OB3_Ins
	, @DTFLAGS_Ins
	, @KTFLAGS_Ins
	UPDATE dbo._1SBKTTLC
		SET
			OB1 = OB1 + @OB1_Ins,
			OB2 = OB2 + @OB2_Ins,
			OB3 = OB3 + @OB3_Ins,
			DTFLAGS = @DTFLAGS_Ins,
			KTFLAGS = @KTFLAGS_Ins
		WHERE
			(DATE = @DATE_Ins) AND
			(KIND = @KIND_Ins) AND
			(ACCKTID = @ACCKTID_Ins) AND
			(ACCDTID = @ACCDTID_Ins) AND
			(CURRID = @CURRID_Ins)
	IF @@ROWCOUNT = 0 BEGIN
		INSERT INTO dbo._1SBKTTLC VALUES
		(
			@DATE_Ins, @ACCDTID_Ins, @ACCKTID_Ins, @CURRID_Ins, @KIND_Ins, @OB1_Ins, @OB2_Ins, @OB3_Ins, @DTFLAGS_Ins, @KTFLAGS_Ins
		)
	END
END
CLOSE TabCur
DEALLOCATE TabCur
DELETE FROM dbo._1SBKTTLC_Ins
COMMIT TRAN
SET NOCOUNT OFF
 



Никаких гарантий, что это правильно и будет быстрее.
  
Наверх
ICQ  
IP записан
 
Переключение на Главную Страницу Страницы: [1] 2 3 4
ОтправитьПечать