|
|
#1 |
|
----------------
|
Блокировка NumberSequence
Интересный эффект достигается вот таким кодом
PHP код:
|
|
|
|
|
#2 |
|
Модератор
|
Да, забавно. Значит, надо каждую пару get..release в отдельную транзакцию заключать. Или try..catch.
С Уважением, Георгий. |
|
|
|
|
#3 |
|
Участник
|
Цитата:
Изначально опубликовано George Nordic
Да, забавно. Значит, надо каждую пару get..release в отдельную транзакцию заключать. Или try..catch. С Уважением, Георгий. после ; PHP код:
PHP код:
|
|
|
|
|
#4 |
|
----------------
|
Цитата:
numberSeq.used();
Цитата:
каждую пару get..release в отдельную транзакцию заключать. Или try..catch
В отдельную транзакцию не всегда возможно. Поэтому предлагаю подправить код на SYS слое ![]() В методе release PHP код:
|
|
|
|
|
#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). | |
|
|
#6 |
|
Banned
|
Баг отправлен через George Nordic в саппорт Microsoft. Прекрасно воспроизводится в 4.0.
|
|
|
|
|
#7 |
|
Участник
|
|
|
|
|
|
#8 |
|
Участник
|
и в каком патче он исправлен для 4-ки?
__________________
Felix nihil admirari |
|
|
|
|
#9 |
|
Участник
|
В 2009-й точно исправлен.
|
|
|
|
|
Похожие темы
|
||||
| Тема | Ответов | |||
| Блокировка таблиц пр InnerJoin | 5 | |||
| Блокировка ключа индекса | 4 | |||
| Блокировка в сводном планировании | 5 | |||
| Блокировка ключа индексации | 2 | |||
| Блокировка всех таблиц | 1 | |||
|