Текущее время: Пт, июл 18 2025, 19:20

Часовой пояс: UTC + 3 часа


Правила форума


ВНИМАНИЕ!

Вопросы по SAP Query и Quick View - сюда



Начать новую тему Ответить на тему  [ Сообщений: 17 ]  На страницу 1, 2  След.
Автор Сообщение
 Заголовок сообщения: Блокировка ENQUEUE_* - не всегда срабатывает
СообщениеДобавлено: Чт, фев 20 2014, 13:59 
Старший специалист
Старший специалист
Аватара пользователя

Зарегистрирован:
Чт, дек 21 2006, 16:38
Сообщения: 304
В программе имеем:
Цитата:
1. Устанавливаем блокировку
2. Если успешно, то выполняем код
3. Снимаем блокировку (если она была установлена в пп.1)
В реале пользователи жаловались, что код из пп.2 иногда работает параллельно (это можно было понять по кривым данным).
В конце концов вставил в программу логирование.
Цитата:
0.Пишу в лог строку "LOCK"
1. Устанавливаем блокировку
2. Если успешно, то пишу в лог "LOCK...OK" и выполняем код
3. Пишу в лог. "UNLOCK". Снимаем блокировку (если она была установлена в пп.1). Пишу в лог "UNLOCK...Ok"
Лог пишу в таблицу с записью времени и имени пользователя. Получаю такой вот лог:
Цитата:
12:58:25 Пользователь 1 LOCK
12:58:28 Пользователь 1 LOCK...Ok
12:58:30 Пользователь 2 LOCK
12:58:30 Пользователь 2 LOCK...Ok
12:58:34 Пользователь 2 UNLOCK
12:58:34 Пользователь 2 UNLOCK...Ok
12:58:34 Пользователь 1 UNLOCK
12:58:34 Пользователь 1 UNLOCK...Ok
Т.e. получается что пользователь 1 УСПЕШНО вызвал ФМ блокировки, потом пользователь 2 также вызвал ФМ блокировки УСПЕШНО, хотя пользователь 1 ещё эту блокировку не отпустил.
Если ли какие-то условия. при котором такое возможно?
В частности в данном случае в пп.2 вызываются пакетники, может при этом блокировки сбрасываются?


Пометить тему как нерешенную
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Блокировка ENQUEUE_* - не всегда срабатывает
СообщениеДобавлено: Чт, фев 20 2014, 14:04 
Почетный гуру
Почетный гуру
Аватара пользователя

Зарегистрирован:
Пн, мар 28 2005, 15:38
Сообщения: 1257
Валерка: покажите код вызова модуля блокировки. Есть подозрение, что Вы указываете неправильные параметры

_________________
Там, где я рос, единственным развлечением было запоминать число «π».(С) Н. Стивенсон


Пометить тему как нерешенную
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Блокировка ENQUEUE_* - не всегда срабатывает
СообщениеДобавлено: Чт, фев 20 2014, 14:18 
Старший специалист
Старший специалист
Аватара пользователя

Зарегистрирован:
Чт, дек 21 2006, 16:38
Сообщения: 304
Вот код вызова.
Code:
  CALL FUNCTION 'ENQUEUE_EZTZZAJSV'
       EXPORTING
            BUKRS          = wa_grid-BUKRS
            NUMZAJ         = wa_grid-NUMZAJ
       EXCEPTIONS
            FOREIGN_LOCK   = 1
            SYSTEM_FAILURE = 2
            OTHERS         = 3.

Это все параметры ФМ-а
Code:
FUNCTION ENQUEUE_EZTZZAJSV.
*"----------------------------------------------------------------------
*"*"Локальный интерфейс:
*"       IMPORTING
*"             VALUE(MODE_ZTZ0006) TYPE  ENQMODE DEFAULT 'E'
*"             VALUE(MODE_ZTZ0007) TYPE  ENQMODE DEFAULT 'E'
*"             VALUE(MODE_ZTZ0013) TYPE  ENQMODE DEFAULT 'E'
*"             VALUE(MODE_ZTZ0014) TYPE  ENQMODE DEFAULT 'E'
*"             VALUE(MANDT) TYPE  ZTZ0006-MANDT DEFAULT SY-MANDT
*"             VALUE(BUKRS) TYPE  ZTZ0006-BUKRS OPTIONAL
*"             VALUE(NUMZAJ) TYPE  ZTZ0006-NUMZAJ OPTIONAL
*"             VALUE(X_BUKRS) DEFAULT SPACE
*"             VALUE(X_NUMZAJ) DEFAULT SPACE
*"             VALUE(_SCOPE) DEFAULT '2'
*"             VALUE(_WAIT) DEFAULT SPACE
*"             VALUE(_COLLECT) TYPE  DDENQCOLL DEFAULT ' '
*"       EXCEPTIONS
*"              FOREIGN_LOCK
*"              SYSTEM_FAILURE
*"----------------------------------------------------------------------
* Сгенерированный ФМ к объекту блокиров. EZTZZAJSV
* Не модифицируйте и не копируйте этот функциональный модуль!
* Информация по SAP-концепции блокирования есть в ABAP-справке
* по ключевому слову 'ENQUEUE'



p.s. Проверил , а не вызывается ли в пп.2 ФМ разблокировки. К сожалению - нет.


Пометить тему как нерешенную
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Блокировка ENQUEUE_* - не всегда срабатывает
СообщениеДобавлено: Чт, фев 20 2014, 14:28 
Специалист
Специалист

Зарегистрирован:
Чт, дек 16 2010, 15:23
Сообщения: 133
Откуда: Набережные Челны
Пол: Мужской
В коде экраны не вызываются?


Пометить тему как нерешенную
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: Блокировка ENQUEUE_* - не всегда срабатывает
СообщениеДобавлено: Чт, фев 20 2014, 14:30 
Почетный гуру
Почетный гуру
Аватара пользователя

Зарегистрирован:
Пн, мар 28 2005, 15:38
Сообщения: 1257
1)
Цитата:
12:58:25 Пользователь 1 LOCK
12:58:28 Пользователь 1 LOCK...Ok


Если это в рамках одной программы - то все нормально. Тип блокировки E разрешает такое

2) Нет ли у Вас там случайно вызовов COMMIT WORK и ROLLBACK WORK? Вы вызываете блокировки с scope = 2. Блокировки наследуются модулем обновления и снимаются или по его завершению или по вызову rollback work.

_________________
Там, где я рос, единственным развлечением было запоминать число «π».(С) Н. Стивенсон


Пометить тему как нерешенную
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Блокировка ENQUEUE_* - не всегда срабатывает
СообщениеДобавлено: Чт, фев 20 2014, 14:35 
Старший специалист
Старший специалист
Аватара пользователя

Зарегистрирован:
Чт, дек 21 2006, 16:38
Сообщения: 304
broker.chelny Вызываются пакетники, которые скорее всего заполняют экраны.
Но на экран они не выводятся.

Кодер это одна и таже программа, но запускаемая ДВУМЯ пользователями параллельно.
Вызывается со scope = 2. Я специально выложил параметры ФМ-а, чтобы были видны значения по умолчанию.
Там есть COMMIT WORK наверняка. rollback work - тоже возможен.
Но ведь rollback work не может отменить уже сделанный COMMIT, так что они, как я понимаю, не могут повлиять.


Пометить тему как нерешенную
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Блокировка ENQUEUE_* - не всегда срабатывает
СообщениеДобавлено: Чт, фев 20 2014, 14:43 
Почетный гуру
Почетный гуру
Аватара пользователя

Зарегистрирован:
Пн, мар 28 2005, 15:38
Сообщения: 1257
2 Валерка:
1)
Цитата:
это одна и таже программа, но запускаемая ДВУМЯ пользователями параллельно.

Тогда что значат 2 строчки, что пользователь1 Lock?

2) Вы меня не поняли. Если выполняется программа вот так
Цитата:
Блокирование с scope=2
commit work

То блок будет снят сразу же, как выполнятся модули обновления IN UPDATE TASK, которые стартанул тот самый commit (да, вызов rollback после этого эту блокировку уже не снимет)
В случае rollback, этот блок будет снят вообще сразу

_________________
Там, где я рос, единственным развлечением было запоминать число «π».(С) Н. Стивенсон


Пометить тему как нерешенную
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Блокировка ENQUEUE_* - не всегда срабатывает
СообщениеДобавлено: Чт, фев 20 2014, 14:46 
Специалист
Специалист

Зарегистрирован:
Чт, дек 16 2010, 15:23
Сообщения: 133
Откуда: Набережные Челны
Пол: Мужской
Проверьте не вызываются ли у Вас неявные commit'ы


Пометить тему как нерешенную
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: Блокировка ENQUEUE_* - не всегда срабатывает
СообщениеДобавлено: Чт, фев 20 2014, 14:49 
Почетный гуру
Почетный гуру
Аватара пользователя

Зарегистрирован:
Пн, мар 28 2005, 15:38
Сообщения: 1257
broker.chelny: можно ссылку на доку, где сказано, что неявные коммиты влияют на lock установленный с помощью ENQUEUE* модулей?

_________________
Там, где я рос, единственным развлечением было запоминать число «π».(С) Н. Стивенсон


Пометить тему как нерешенную
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Блокировка ENQUEUE_* - не всегда срабатывает
СообщениеДобавлено: Чт, фев 20 2014, 14:51 
Специалист
Специалист

Зарегистрирован:
Чт, дек 16 2010, 15:23
Сообщения: 133
Откуда: Набережные Челны
Пол: Мужской
Кодер, а разве _scope = 2 не снимается при commit?


Пометить тему как нерешенную
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: Блокировка ENQUEUE_* - не всегда срабатывает
СообщениеДобавлено: Чт, фев 20 2014, 14:52 
Почетный гуру
Почетный гуру
Аватара пользователя

Зарегистрирован:
Пн, мар 28 2005, 15:38
Сообщения: 1257
broker.chelny : Только явный коммит

_________________
Там, где я рос, единственным развлечением было запоминать число «π».(С) Н. Стивенсон


Пометить тему как нерешенную
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Блокировка ENQUEUE_* - не всегда срабатывает
СообщениеДобавлено: Чт, фев 20 2014, 15:08 
Старший специалист
Старший специалист
Аватара пользователя

Зарегистрирован:
Чт, дек 21 2006, 16:38
Сообщения: 304
Кодер Одна строка "LOCK" пишется в лог ДО вызова ФМ-а блокировки, вторая строка "LOCK...Ok" пишется в лог ПОСЛЕ выхода из ФМ-а блокировки. Т.е. между этими строками происходит вызов ФМ-а блокировки. Так что что эти две строки показывают, что ФМ блокировки был вызван и управление из него вернулось.

Между блокировкой и разюлокировкой COMMIT-ы у меня вызываются.


Пометить тему как нерешенную
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Блокировка ENQUEUE_* - не всегда срабатывает
СообщениеДобавлено: Чт, фев 20 2014, 15:16 
Почетный гуру
Почетный гуру
Аватара пользователя

Зарегистрирован:
Пн, мар 28 2005, 15:38
Сообщения: 1257
Валерка: если у Вас есть ФМ IN UPDATE TASK, тогда, по их завершению после коммита, блокировки автоматом снимутся без DEQUEUE*. Почитайте курс BC414, чтобы лучше понять механизм работы обновлений и блокировок

_________________
Там, где я рос, единственным развлечением было запоминать число «π».(С) Н. Стивенсон


Пометить тему как нерешенную
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Блокировка ENQUEUE_* - не всегда срабатывает
СообщениеДобавлено: Чт, фев 20 2014, 15:33 
Старший специалист
Старший специалист
Аватара пользователя

Зарегистрирован:
Чт, дек 21 2006, 16:38
Сообщения: 304
Кодер у меня таких ФМ-ов точно нет. Но я использую чужой ФМ, который внутри ещё и пакетник вызывает, так что неизвестно, что там может быть, если раскручивать это полностью.

А нет возможности указать принудительно, чтобы блокировки автоматом не снимались?


Пометить тему как нерешенную
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Блокировка ENQUEUE_* - не всегда срабатывает  Тема решена
СообщениеДобавлено: Чт, фев 20 2014, 15:42 
Почетный гуру
Почетный гуру
Аватара пользователя

Зарегистрирован:
Пн, мар 28 2005, 15:38
Сообщения: 1257
Валерка:
1) Прочитайте курс. После это станет гораздо понятнее, как все это работает
2) вызовы пакетников ничего с вашей блокировкой сделать не могу. Пакетник живет в др. процессе.
3) странно, что у Вас нет таких фм. В этом случае возможные варианты
Цитата:
вызов ENQUEUE*
commit work

блокировка остается висеть пока:
- или снимут принудительно через DEQUEUE
- или снимут вызовом rollback work
- или завершение транзакции
4) Если использовать другие значения SCOPE, то поведение будет другое. Читать здесь

_________________
Там, где я рос, единственным развлечением было запоминать число «π».(С) Н. Стивенсон


Пометить тему как нерешенную
Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 17 ]  На страницу 1, 2  След.

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


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

Найти:
Перейти:  
cron
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB