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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 18.01.2013, 16:16   #1  
p314 is offline
p314
Участник
 
2 / 10 (1) +
Регистрация: 18.01.2013
Пытаюсь разобраться с механизмом блокировок таблиц в нативной NAV 4. Не получается нормально блокировать таблицу.

Открываю первого Клиента (Пользователь А)

Rec.LOCKTABLE;
IF CONFIRM('') THEN; //Останов, чтобы не снялась блокировка

Открываю второго Клиента (Пользователь Б)и пробую вставить в эту таблицу запись

Rec.INIT;
...
Rec.INSERT

Запись вставляется без проблем, хотя таблица должна быть заблокирована Пользователем А. Что не так?

Удивительно, но если добавить FINDLAST

Rec.LOCKTABLE;
Rec.FINDLAST;
IF CONFIRM('') THEN;

то блокировка работает, и при попытке вставить запись Пользователем Б,будет выведено сообщение, что таблица заблокирована Пользователем А.

Что делать?
Старый 18.01.2013, 16:56   #2  
Alex NF is offline
Alex NF
Участник
 
10 / 10 (1) +
Регистрация: 16.02.2005
Может быть, это фича такая: пока с таблицей ничего не делают, она не блокируется. Если так, то что мешает ставить FIND[LAST]?
Старый 18.01.2013, 17:33   #3  
Fordewind is offline
Fordewind
Участник
 
1,134 / 10 (3) +
Регистрация: 01.12.2005
Хелп говорит:
Because all write operations automatically lock the table in use, LOCKTABLE would appear unnecessary. However, you could have a transaction in which an application wants to inspect data and then only possibly change it, with a guarantee that the data being changed has not been modified by other applications since the read operation. The solution is to explicitly lock the table before the read operation. This ensures that no other application makes changes between the read operation and the possible write operation.
Старый 18.01.2013, 17:45   #4  
Storkich is offline
Storkich
Участник
 
149 / 10 (1) +
Регистрация: 08.03.2007
Воспринимай LOCKTABLE не как команду, отправляемую на сервер, а как свойство "При обращении к таблице, заблокировать её".
Старый 21.01.2013, 13:06   #5  
p314 is offline
p314
Участник
 
2 / 10 (1) +
Регистрация: 18.01.2013
[extract]Воспринимай LOCKTABLE не как команду, отправляемую на сервер, а как свойство "При обращении к таблице, заблокировать её".[/extract]

Тогда и в первом варианте Пользователь Б при попытке вставить запись, должен был получить сообщение, что таблица заблокирована

Цитата:
Может быть, это фича такая: пока с таблицей ничего не делают, она не блокируется. Если так, то что мешает ставить FIND[LAST]?
В оригинальном коде много мест, где стоит только LOCKTABLE и предполагается, что все работает и не нужно никаких дополнительных команд типа FIND, чтобы таблица бала гарантировано заблокирована.
Старый 21.01.2013, 13:08   #6  
rmv is offline
rmv
Участник
 
481 / 11 (1) +
Регистрация: 15.02.2005
Пишу одно, делаю другое.
LOCKTABLE не блокирует таблицу, а только к конкретную запись таблицы, после обращения к ней.
Старый 21.01.2013, 13:40   #7  
Fordewind is offline
Fordewind
Участник
 
1,134 / 10 (3) +
Регистрация: 01.12.2005
Цитата:
Сообщение от rmv Посмотреть сообщение
Пишу одно, делаю другое.
LOCKTABLE не блокирует таблицу, а только к конкретную запись таблицы, после обращения к ней.
Это если база SQL
 


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

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

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 21:12.
Powered by vBulletin® v3.8.5. Перевод: zCarot
Контактная информация, Реклама.