Показать сообщение отдельно
Старый 04.10.2005, 11:40   #28  
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 снимаются!