AXForum  
Вернуться   AXForum > Microsoft Dynamics AX > DAX: Программирование
All
Забыли пароль?
Зарегистрироваться Правила Справка Пользователи Сообщения за день Поиск Все разделы прочитаны

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 11.08.2005, 10:44   #1  
Wamr is offline
Wamr
----------------
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
 
1,737 / 858 (32) +++++++
Регистрация: 15.01.2002
Адрес: Москва
Записей в блоге: 7
Блокировка NumberSequence
Интересный эффект достигается вот таким кодом
PHP код:
static void Job92(Args _args)
{
    
NumberSeq               numberSeq;
    
Voucher                 releaseVoucher;
    ;

    
ttsbegin;
    
numberSeq NumberSeq::newGetVoucher(VendParameters::numRefVendPaymentVoucher());
    
releaseVoucher numberSeq.voucher();
    
NumberSeq::release(VendParameters::numRefVendPaymentVoucher().NumberSequence,releaseVoucher);

    
numberSeq NumberSeq::newGetVoucher(VendParameters::numRefVendPaymentVoucher());
    
releaseVoucher numberSeq.voucher();
    
ttscommit;

Аксапта просто вешается, так как основной процесс блокирует 1 запись в NumberSequenceTable и повторная попытка выделить номер из этой серии останавливается в бесконечном ожидании.
Старый 11.08.2005, 11:04   #2  
George Nordic is offline
George Nordic
Модератор
Аватар для George Nordic
Злыдни
 
4,479 / 1250 (50) ++++++++
Регистрация: 17.12.2003
Адрес: Moscow
Записей в блоге: 9
Да, забавно. Значит, надо каждую пару get..release в отдельную транзакцию заключать. Или try..catch.

С Уважением,
Георгий.
Старый 11.08.2005, 11:17   #3  
Gad is offline
Gad
Участник
 
136 / 18 (1) ++
Регистрация: 21.05.2003
Адрес: Москва
Цитата:
Изначально опубликовано George Nordic
Да, забавно. Значит, надо каждую пару get..release в отдельную транзакцию заключать. Или try..catch.

С Уважением,
Георгий.
Это нормально, кроме того на мой взгляд следует добавить
после
;
PHP код:
releaseVoucher numberSeq.voucher(); 
что номер использован
PHP код:
numberSeq.used(); 
Старый 11.08.2005, 12:41   #4  
Wamr is offline
Wamr
----------------
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
 
1,737 / 858 (32) +++++++
Регистрация: 15.01.2002
Адрес: Москва
Записей в блоге: 7
Цитата:
numberSeq.used();
Не поможет - этот метод имеет смысл только для непрерывных серий, если при создании объекта передавался параметр makeDecisionLater = TRUE

Цитата:
каждую пару get..release в отдельную транзакцию заключать. Или try..catch
try-catch тут вообще не при чем.
В отдельную транзакцию не всегда возможно.
Поэтому предлагаю подправить код на SYS слое
В методе release
PHP код:
    numberSequenceTable NumberSequenceTable::find(_numberSequenceCode);//,TRUE); 
Старый 10.01.2007, 22:55   #5  
Logger is offline
Logger
Участник
Лучший по профессии 2015
Лучший по профессии 2014
 
3,940 / 3229 (115) ++++++++++
Регистрация: 12.10.2004
Адрес: Москва
Записей в блоге: 2
Описанная проблема возникает из-за того что метод NumberSeq::release() использует текущее соединение с базой для обновления таблиц numberSequenceTable и numberSequenceList

Если мы посмотрим как работает метод NumberSeq.getNumInternal() (этот метод вызывается, когда мы получаем номер из номерной серии) то видим, что для доступа к таблицам номерных серий numberSequenceTable и numberSequenceList используется отдельное соединение с базой. Это нужно для того чтобы снизить вероятность блокировки пользователями друг друга при разносках документов и при обработке накладных.

А метод NumberSeq::release() так не делает !

Из за чего клиент может легко заблокировать сам себя при определенной последовательности вызовов. (пример Wamr-а)

При работе в системе этот баг может проявляться если
1. мы пытаемся в одной транзакции рассопоставить несколько проводок (более одной).
2. удалили строку LedgerJournalTrans и затем попытались создать заново выделив новый Voucher

(2- верно для случая когда
X++:
        ledgerJournalType != LedgerJournalType::Periodic    &&
        ledgerJournalType != LedgerJournalType::VendInvoicePool &&
        ledgerJournalType != LedgerJournalType::VendInvoicePoolNotPosted)
см. код метода LedgerJournalTran.delete()
)

Случаи 1 и 2 удалось воспроизвести только при написании модификаций, джобов. При обычной работе системы без модификаций глюк не воспроизводился.

Прилагаю вложение с исправлением кода метода NumberSeq::release()

Ax 3.0 sp3 Oracle

P.S.
Внимательно пересмотрел классы по работе с номерными сериями - проблема с блокировками может возникать также при использовании метода
\Classes\NumberSeq_RU\useNumFromList
так как там тоже идет обращение к таблицам номерных серий через обычное соединение. - Как следствие могут быть проблемы с блокировками.

Этот метод используется при обработке счетов фактур. Тоже надо бы пофиксить.
Вложения
Тип файла: txt NumberSeq_release.txt (5.1 Кб, 542 просмотров)

Последний раз редактировалось Logger; 10.01.2007 в 22:59. Причина: Добавлено вложение
За это сообщение автора поблагодарили: Dron AKA andy (2), Ivan Mischenko (1), Vadik (5), Roman777 (2), SHiSHok (2), wojzeh (1), sgt.Pepper (1), jkspb (1).
Старый 13.02.2007, 18:05   #6  
EVGL is offline
EVGL
Banned
Соотечественники
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
4,445 / 3001 (0) ++++++++++
Регистрация: 09.07.2002
Адрес: Parndorf, AT
Баг отправлен через George Nordic в саппорт Microsoft. Прекрасно воспроизводится в 4.0.
Старый 13.02.2007, 19:06   #7  
Logger is offline
Logger
Участник
Лучший по профессии 2015
Лучший по профессии 2014
 
3,940 / 3229 (115) ++++++++++
Регистрация: 12.10.2004
Адрес: Москва
Записей в блоге: 2
Цитата:
Сообщение от EVGL Посмотреть сообщение
Баг отправлен через George Nordic в саппорт Microsoft. Прекрасно воспроизводится в 4.0.
Ура !

Интересно, а в 2,5 он тоже присутствовал ?
Нет возможности проверить. Но подозреваю что был.
Старый 08.12.2009, 18:23   #8  
wojzeh is offline
wojzeh
Участник
Аватар для wojzeh
Соотечественники
 
674 / 512 (19) +++++++
Регистрация: 27.04.2006
Адрес: Montreal
и в каком патче он исправлен для 4-ки?
__________________
Felix nihil admirari
Старый 09.12.2009, 12:35   #9  
Logger is offline
Logger
Участник
Лучший по профессии 2015
Лучший по профессии 2014
 
3,940 / 3229 (115) ++++++++++
Регистрация: 12.10.2004
Адрес: Москва
Записей в блоге: 2
В 2009-й точно исправлен.
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Блокировка таблиц пр InnerJoin Logger DAX: Программирование 5 26.11.2007 18:21
Блокировка ключа индекса Sequel DAX: Программирование 4 06.07.2006 16:08
Блокировка в сводном планировании BeLFO DAX: Функционал 5 01.09.2005 09:12
Блокировка ключа индексации velk DAX: Программирование 2 10.08.2005 12:01
Блокировка всех таблиц DreamCreator DAX: Администрирование 1 09.08.2005 16:07
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 02:08.