11.08.2005, 10:44 | #1 |
----------------
|
Блокировка NumberSequence
Интересный эффект достигается вот таким кодом
PHP код:
|
|
11.08.2005, 11:04 | #2 |
Модератор
|
Да, забавно. Значит, надо каждую пару get..release в отдельную транзакцию заключать. Или try..catch.
С Уважением, Георгий. |
|
11.08.2005, 11:17 | #3 |
Участник
|
Цитата:
Изначально опубликовано George Nordic
Да, забавно. Значит, надо каждую пару get..release в отдельную транзакцию заключать. Или try..catch. С Уважением, Георгий. после ; PHP код:
PHP код:
|
|
11.08.2005, 12:41 | #4 |
----------------
|
Цитата:
numberSeq.used();
Цитата:
каждую пару get..release в отдельную транзакцию заключать. Или try..catch
В отдельную транзакцию не всегда возможно. Поэтому предлагаю подправить код на SYS слое В методе release PHP код:
|
|
10.01.2007, 22:55 | #5 |
Участник
|
Описанная проблема возникает из-за того что метод 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) ) Случаи 1 и 2 удалось воспроизвести только при написании модификаций, джобов. При обычной работе системы без модификаций глюк не воспроизводился. Прилагаю вложение с исправлением кода метода NumberSeq::release() Ax 3.0 sp3 Oracle P.S. Внимательно пересмотрел классы по работе с номерными сериями - проблема с блокировками может возникать также при использовании метода \Classes\NumberSeq_RU\useNumFromList так как там тоже идет обращение к таблицам номерных серий через обычное соединение. - Как следствие могут быть проблемы с блокировками. Этот метод используется при обработке счетов фактур. Тоже надо бы пофиксить. Последний раз редактировалось 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 |
Banned
|
Баг отправлен через George Nordic в саппорт Microsoft. Прекрасно воспроизводится в 4.0.
|
|
13.02.2007, 19:06 | #7 |
Участник
|
|
|
08.12.2009, 18:23 | #8 |
Участник
|
и в каком патче он исправлен для 4-ки?
__________________
Felix nihil admirari |
|
09.12.2009, 12:35 | #9 |
Участник
|
В 2009-й точно исправлен.
|
|
|
Похожие темы | ||||
Тема | Ответов | |||
Блокировка таблиц пр InnerJoin | 5 | |||
Блокировка ключа индекса | 4 | |||
Блокировка в сводном планировании | 5 | |||
Блокировка ключа индексации | 2 | |||
Блокировка всех таблиц | 1 |
|