Переключение на Главную Страницу Страницы: [1] 2  ОтправитьПечать
Горячая тема (более 10 ответов) Как переделать лучше эту функцию МОДа? (число прочтений - 5997 )
Вадимко
God Member
*****
Отсутствует


Нам бы чего про ОдноЦэ...

Сообщений: 1048
Местоположение: Минск
Зарегистрирован: 24. Мая 2006
Пол: Мужской
Как переделать лучше эту функцию МОДа?
25. Января 2008 :: 16:56
Печать  
Код
Выбрать все
Функция ПолучитьНовыйИДД()
	//Предусматриваем одновременное обращение к константе нескольких пользователей
	Блокировка=1;
	Пока Блокировка=1 Цикл
		Попытка
			НачатьТранзакцию();
			Константа.УникальныйIDD=Константа.УникальныйIDD;//блокируем
			Блокировка=0;//константа заблокирована не была - можем работать
		Исключение//константа заблокирована !!
			ОтменитьТранзакцию();
			//Ожидание для возможности работы других пользователей (по совету Олега Яковлева из ЧПТФ "ЮСИ")
			Стр=ТекущееВремя();
			Пока Стр=ТекущееВремя() Цикл
			КонецЦикла;
		КонецПопытки;
	КонецЦикла;
	//Увеличиваем счетчик в константе на единицу
	Константа.УникальныйIDD=Число(Константа.УникальныйIDD)+1;
	никальныйIDD),10);
	ЗафиксироватьТранзакцию();
	Возврат Рез;

КонецФункции
 



Это из МОДа
Задача - сделать быстрее, может с помощью своей таблички, НО (!) оставить последовательную нумерацию, чтобы было ПоследнийИДД = ПредПоследнийИДД + 1 (Гуид видимо не прокатит)
И убрать транзакцию по возможности, но обеспечить контроль одновременной записи (ну или хотя бы попытку и откат транзакции)
А то есть плохие опасения в связи с большой нагрузкой и одновременными записями объектов
Вот и все, выскажитесь плиз  Круглые глаза
  

Кампутер, кофе и сигареты - это очень плохо для моего здоровья...
Наверх
IP записан
 
Nick
God Member
*****
Отсутствует



Сообщений: 1599
Местоположение: г.Новокузнецк
Зарегистрирован: 21. Февраля 2007
Пол: Мужской
Re: Как переделать лучше эту функцию МОДа?
Ответ #1 - 26. Января 2008 :: 04:36
Печать  
Ну для начла не использовать константы, они и так перегружены работой с переодическими реквизитами
  
Наверх
ICQ  
IP записан
 
varelchik
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 788
Зарегистрирован: 22. Мая 2006
Re: Как переделать лучше эту функцию МОДа?
Ответ #2 - 26. Января 2008 :: 08:11
Печать  
Вадимко!
Ты что тоже МОДом увлекаешься?
Пардон за несоответствие вопросу.
  
Наверх
 
IP записан
 
Вадимко
God Member
*****
Отсутствует


Нам бы чего про ОдноЦэ...

Сообщений: 1048
Местоположение: Минск
Зарегистрирован: 24. Мая 2006
Пол: Мужской
Re: Как переделать лучше эту функцию МОДа?
Ответ #3 - 26. Января 2008 :: 13:36
Печать  
2(Nick) Вот-вот, не использовать константы
Ибо у нас они тоже блокируются (как и журнал), т.к. юзвери работают просто как бешеные
Вроде с журналом блокировки редки стали, т.к. конфига потиху оптимизируется, а этот МОД портит все

2(varelchik) К сожалению пришлось использовать, т.к. написать свое просто нет времени. А я бы сделал гораздо бытрее и интереснее (если абстрагироваться от того что МОД предоставляет широкие возможности) Улыбка

Так какие предложения?
Допустим используем свою табличку
Как лучше обеспечить уникальность ИДД?
Вот так взлетит?

set implicit_transactions on
exec _1sp__МояТаблица_TLockX
--тут читаю последнее значение и записываю новое
if @@trancount > 0 commit tran
set implicit_transactions off

  

Кампутер, кофе и сигареты - это очень плохо для моего здоровья...
Наверх
IP записан
 
Nick
God Member
*****
Отсутствует



Сообщений: 1599
Местоположение: г.Новокузнецк
Зарегистрирован: 21. Февраля 2007
Пол: Мужской
Re: Как переделать лучше эту функцию МОДа?
Ответ #4 - 26. Января 2008 :: 15:25
Печать  
А авто инкримент тебя не устроит?
  
Наверх
ICQ  
IP записан
 
Вадимко
God Member
*****
Отсутствует


Нам бы чего про ОдноЦэ...

Сообщений: 1048
Местоположение: Минск
Зарегистрирован: 24. Мая 2006
Пол: Мужской
Re: Как переделать лучше эту функцию МОДа?
Ответ #5 - 26. Января 2008 :: 15:33
Печать  
Устроит
Предлагаешь фпоиск на скл.ру? Улыбка
Да тут же просто последнее значение хранить надо
  

Кампутер, кофе и сигареты - это очень плохо для моего здоровья...
Наверх
IP записан
 
Nick
God Member
*****
Отсутствует



Сообщений: 1599
Местоположение: г.Новокузнецк
Зарегистрирован: 21. Февраля 2007
Пол: Мужской
Re: Как переделать лучше эту функцию МОДа?
Ответ #6 - 26. Января 2008 :: 16:18
Печать  
Цитата:
Устроит
Предлагаешь фпоиск на скл.ру? Улыбка
Да тут же просто последнее значение хранить надо

Не не предлагаю Улыбка
Наверно да можно просто брать последнее значение,
только причем тут set implicit_transactions?
Тебе лучше явно начинать транзакцию и уровень изолированности Serializable
чтоб наверняка Улыбка
  
Наверх
ICQ  
IP записан
 
Вадимко
God Member
*****
Отсутствует


Нам бы чего про ОдноЦэ...

Сообщений: 1048
Местоположение: Минск
Зарегистрирован: 24. Мая 2006
Пол: Мужской
Re: Как переделать лучше эту функцию МОДа?
Ответ #7 - 27. Января 2008 :: 20:44
Печать  
У меня траблы с хинтами и уровнями
Я бывший бух без толковых книг, поэтому попрошу конкретный пример Улыбка
ЗЫ. Если не трудно, заранее спасибо
  

Кампутер, кофе и сигареты - это очень плохо для моего здоровья...
Наверх
IP записан
 
Nick
God Member
*****
Отсутствует



Сообщений: 1599
Местоположение: г.Новокузнецк
Зарегистрирован: 21. Февраля 2007
Пол: Мужской
Re: Как переделать лучше эту функцию МОДа?
Ответ #8 - 28. Января 2008 :: 02:35
Печать  
да там показывать особо нечего

SET TRANSACTION ISOLATION LEVEL SERIALIZABLE
BEGIN TRANSACTION

-- тут твой код
COMMIT TRANSACTION
SET TRANSACTION ISOLATION LEVEL READ COMMITTED
  
Наверх
ICQ  
IP записан
 
kiruha
1c++ power user
Отсутствует



Сообщений: 1249
Зарегистрирован: 11. Апреля 2007
Re: Как переделать лучше эту функцию МОДа?
Ответ #9 - 28. Января 2008 :: 09:49
Печать  
Код
Выбрать все
Пока Блокировка=1 Цикл
		Попытка
			НачатьТранзакцию();
			Константа.УникальныйIDD=Константа.УникальныйIDD;//блокируем
			Блокировка=0;//константа заблокирована не была - можем работать
		Исключение//константа заблокирована !!
			ОтменитьТранзакцию();
			//Ожидание для возможности работы других пользователей (по совету Олега Яковлева из ЧПТФ "ЮСИ")
			Стр=ТекущееВремя();
			Пока Стр=ТекущееВремя() Цикл
			КонецЦикла;
		КонецПопытки;
	КонецЦикла;
 



В этом коде блокировка появляется не из за
Константа.УникальныйIDD=
а из за НачатьТранзакцию(); при этом блокируется все таблицы кроме справочников.
Как работает
Код
Выбрать все
Исключение//константа заблокирована !!
			ОтменитьТранзакцию(); 


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

Можно штатными средствами завести служебный справочник "МоиКонстанты", там элемент
имитирующий константу(с кодом "УникальныйIDD") и блокировать справочник штатно методом
Блокировка
  
Наверх
 
IP записан
 
Вадимко
God Member
*****
Отсутствует


Нам бы чего про ОдноЦэ...

Сообщений: 1048
Местоположение: Минск
Зарегистрирован: 24. Мая 2006
Пол: Мужской
Re: Как переделать лучше эту функцию МОДа?
Ответ #10 - 30. Января 2008 :: 11:40
Печать  
Вот позырьте, одним запросом сделал (добрался-таки, все время мешают работать Улыбка)
И транзакции отпали:

Код
Выбрать все
	ТекстЗапроса = "
	|select right('0000000' + LTrim(idd), 7) + right('0000000000' + LTrim(str(uidd + 1, 10)),10)
	|from UIDD
	|update UIDD
	|set uidd = uidd + 1
	|";

	ТЗ = RecordSet.ВыполнитьИнструкцию(ТекстЗапроса);
	ТЗ.ВыбратьСтроку();
 

  

Кампутер, кофе и сигареты - это очень плохо для моего здоровья...
Наверх
IP записан
 
berezdetsky
1c++ power user
Отсутствует


barba non facit sisadminum

Сообщений: 1986
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Как переделать лучше эту функцию МОДа?
Ответ #11 - 30. Января 2008 :: 12:16
Печать  
IMHO, updlock в select был бы не лишний..
  

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


Нам бы чего про ОдноЦэ...

Сообщений: 1048
Местоположение: Минск
Зарегистрирован: 24. Мая 2006
Пол: Мужской
Re: Как переделать лучше эту функцию МОДа?
Ответ #12 - 30. Января 2008 :: 12:19
Печать  
Дописал, спасибки
Но ведь это одна инструкция!
  

Кампутер, кофе и сигареты - это очень плохо для моего здоровья...
Наверх
IP записан
 
Nick
God Member
*****
Отсутствует



Сообщений: 1599
Местоположение: г.Новокузнецк
Зарегистрирован: 21. Февраля 2007
Пол: Мужской
Re: Как переделать лучше эту функцию МОДа?
Ответ #13 - 30. Января 2008 :: 12:27
Печать  
Код
Выбрать все
		|select right('0000000' + LTrim(idd), 7) + right('0000000000' + LTrim(str(uidd + 1, 10)),10)
	|from UIDD
	|update UIDD
	|set uidd = uidd + 1
 



А как гарантируется что между Select и Update не вклинится другая инструкция?
  
Наверх
ICQ  
IP записан
 
Nick
God Member
*****
Отсутствует



Сообщений: 1599
Местоположение: г.Новокузнецк
Зарегистрирован: 21. Февраля 2007
Пол: Мужской
Re: Как переделать лучше эту функцию МОДа?
Ответ #14 - 30. Января 2008 :: 12:34
Печать  
Цитата:
Дописал, спасибки
Но ведь это одна инструкция!

Инструкция кстати не одна
  
Наверх
ICQ  
IP записан
 
Переключение на Главную Страницу Страницы: [1] 2 
ОтправитьПечать