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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 03.10.2005, 10:53   #1  
DeSp is offline
DeSp
Участник
 
41 / 10 (1) +
Регистрация: 27.09.2005
Выполняемая операция регистрации использует несколько кодеюнитов. Если я правильно Вас понял, то если я залочил таблицы в одном кодеюните, а потом вызвал код из другого кодеюнита, то залоченные таблицы будут разлочены?
COMMIT, используемый в вызывнном кодеюните завершит все транзакции только текущего кодеюнита или и транзакции вызвавшего кодеюнита?
Старый 04.10.2005, 10:13   #2  
zub is offline
zub
Участник
 
40 / 10 (1) +
Регистрация: 23.08.2005
Выход из codeunit не преводит к снятию блокировки, а вот COMMIT снимет абсолютно все блокировки сделанные до него, независимо от вызовов codeunit
Поэтому желательно делать один СOMMIT в конце совершаемой операции
Старый 04.10.2005, 11:40   #3  
Alterant is offline
Alterant
Участник
 
378 / 10 (1) +
Регистрация: 31.03.2004
Цитата:
Сообщение от zub
Выход из codeunit не преводит к снятию блокировки, а вот COMMIT снимет абсолютно все блокировки сделанные до него, независимо от вызовов codeunit
Поэтому желательно делать один СOMMIT в конце совершаемой операции
Zub, не вводите, пожалуйста, людей в заблуждение! Специально провел тестирование - выход из codeunit СНИМАЕТ, установленные в нем блокировки!

Тестирование проводилось на SQL Server, следующим кодом:
<div class='CALtop'>C/AL</div><div class='CAL'>
OBJECT Codeunit 99000 TestCommit
{
 OBJECT-PROPERTIES
 {
   Дата=04.10.05;
   Время=11:17:19;
   Изменен=Да;
   Список версий=;
 }
 PROPERTIES
 {
   OnRun=BEGIN
           PayTerms.LOCKTABLE;
           SLEEP(10000);
         END;

 }
 CODE
 {
   VAR
     PayTerms@1000000000 : Record 3;

   BEGIN
   END.
 }
}

OBJECT Codeunit 99001 LockRun
{
 OBJECT-PROPERTIES
 {
   Дата=04.10.05;
   Время=11:19:42;
   Изменен=Да;
   Список версий=;
 }
 PROPERTIES
 {
   OnRun=BEGIN
           LockTest.RUN;
           SLEEP(5000);
           LockTest.RUN;
           MESSAGE('%1', TIME);
         END;

 }
 CODE
 {
   VAR
     LockTest@1000000000 : Codeunit 99000;

   BEGIN
   END.
 }
}

OBJECT Codeunit 99002 LockRun2
{
 OBJECT-PROPERTIES
 {
   Дата=04.10.05;
   Время=11:20:39;
   Изменен=Да;
   Список версий=;
 }
 PROPERTIES
 {
   OnRun=BEGIN
           LockTest.RUN;
           MESSAGE('%1', TIME);
         END;

 }
 CODE
 {
   VAR
     LockTest@1000000000 : Codeunit 99000;

   BEGIN
   END.
 }
}
</div>
Первый пользователь запустил кодюнит 99001 LockRun, второй сразу после него 99002 LockRun2. По результатам теста, второй пользователь получил сообщение раньше, чем первый. Если бы система сохранила блокировки установленные при первом вызове кодюнита 99000 TestCommit первым пользователем (из кодюнита 99001 LockRun), то второй пользователь получил бы доступ к таблице только после первого, т.е. результаты теста были бы другими.
Причем результаты теста не зависят от того, вызывался ли кодюнит с обработкой возвращаемого значения или без, т.е. и в случае
<div class='CALtop'>C/AL</div><div class='CAL'>
LockTest.RUN
</div>
и
<div class='CALtop'>C/AL</div><div class='CAL'>
IF LockTest.RUN THEN
</div>
блокировки установленные в LockTest снимаются!
 

Опции темы Поиск в этой теме
Поиск в этой теме:

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

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

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

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