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

Часовой пояс: 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 часа


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

Сейчас этот форум просматривают: Yandex [Bot]


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

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