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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 20.07.2009, 10:33   #1  
RedFox is offline
RedFox
Участник
 
1,441 / 10 (0) +
Регистрация: 28.12.2004
Адрес: Киев
Цитата:
Сообщение от GRIZZLY Посмотреть сообщение
Разве при учете не происходит блокирование всех записей таблицы G/L Entry вплоть до окончания учета?
Полной блокировки нет, особенно на SQL (например там блокируется всего несколько записей, а не вся таблица). И при код может дойти до нахождения последнего номера, получить его, а потом откатиться.
Старый 20.07.2009, 10:52   #2  
Alterant is offline
Alterant
Участник
 
378 / 10 (1) +
Регистрация: 31.03.2004
Цитата:
Сообщение от RedFox Посмотреть сообщение
Полной блокировки нет, особенно на SQL (например там блокируется всего несколько записей, а не вся таблица). И при код может дойти до нахождения последнего номера, получить его, а потом откатиться.
Это не так. На SQL конструкцией:
Table.Locktable;
Table.Find('+');
тоже блокируется весь диапазон.
COMMITа в учетном коде до завершения быть не должно, поэтому ситуация довольно странная.
Старый 20.07.2009, 15:03   #3  
rmv is offline
rmv
Участник
 
481 / 11 (1) +
Регистрация: 15.02.2005
Цитата:
Сообщение от RedFox Посмотреть сообщение
Полной блокировки нет, особенно на SQL (например там блокируется всего несколько записей, а не вся таблица). И при код может дойти до нахождения последнего номера, получить его, а потом откатиться.

Цитата:
Сообщение от Alterant Посмотреть сообщение
Это не так. На SQL конструкцией:
Table.Locktable;
Table.Find('+');
тоже блокируется весь диапазон.
COMMITа в учетном коде до завершения быть не должно, поэтому ситуация довольно странная.
Как мне представляется блокируются несколько записей, а не диапазон.
Начиная с момента выполнения кода:
Table.Locktabe;
Table.find('+');
и до commit'a или отката транзакции другие клиенты Нава, выполняющие тот же код будут ждать окончания блокировки ПОСЛЕДНЕЙ записи на команде find('+'), и неважно чем закончиться блокирующий процесс - откатом транзакции или коммитом. В любом случае следующий процесс прочитает последний номер операции.
При таком построении кода гарантируется уникальность и отсутствие пропусков в номерах операций при многопользовательской работе.
Думаю стоит копать в сторону инкремента NextEntryNo без вставки в 17 таблицу.
Для начала посмотрите фин. регистры возможно номера отсутствующих операций лежат в диапазоне одной операции учета.

PS. NAV 50SP1 и Nav Express не видел, однако объемы изощренного RU кода начиная с 4.0 SP2 растут в 12 cu с пугающей меня быстротой.
Старый 20.07.2009, 17:04   #4  
Alterant is offline
Alterant
Участник
 
378 / 10 (1) +
Регистрация: 31.03.2004
Цитата:
Сообщение от rmv Посмотреть сообщение
Как мне представляется блокируются несколько записей, а не диапазон.
Начиная с момента выполнения кода:
Table.Locktabe;
Table.find('+');
и до commit'a или отката транзакции другие клиенты Нава, выполняющие тот же код будут ждать окончания блокировки ПОСЛЕДНЕЙ записи на команде find('+')
Вы правы, я выразился не точно. Только одна поправка - блокируется как последняя запись, так и диапазон, находящийся за ней. Т.е. вставить запись с номером, превышающим номер последней записи, скажем, на миллион тоже не получится. Это я имел ввиду. А вот вставлять в начало или середину таблицы при такой блокировке вполне можно.
 


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

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

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