SAPфорум.RU
https://sapboard.ru/forum/

Модуль обновления: нарушена транзакционность
https://sapboard.ru/forum/viewtopic.php?f=13&t=94190
Страница 1 из 1

Автор:  skaa [ Чт, дек 15 2016, 11:34 ]
Заголовок сообщения:  Модуль обновления: нарушена транзакционность

Добрый день! Подскажите, пожалуйста:

В документации написано, что транзакционность на уровне сервера приложений обеспечивают «модули обновления» (такие как CALL FUNCTION IN UPDATE TASK, PERFORM ON COMMIT).

Использую perform on commit, но транзакционность нарушается.
Code:
report  ztest.

perform test on commit.
commit work and wait.

form test .
  data: ls_test1 type ztest1.
  select single * from ztest1 into ls_test1
    where var = '3 ' and belnr = '0000000032'.
  delete from ztest1
  where var = '3 ' and belnr = '0000000032'.
  ls_test1-var = '1 '.
  ls_test1-belnr = '0000000001'.
  insert ztest1 from ls_test1.
endform.                    " TEST


Строчка удаляется из таблицы ztest1, но новая строчка не добавляется (в данном случае - из-за дубликата).
Почему транзакционность нарушена (одна операция в модуле обновления выполнена, а вторая нет) при использовании модуля обновления?

Автор:  Кодер [ Чт, дек 15 2016, 11:50 ]
Заголовок сообщения:  Re: Модуль обновления -нарушена транзакционность.

Потому, что вы сами должны обработать ситуацию "ошибка в процессе обновления". Т.к. вы ее не обработали, т.е. не сообщили системе как себя вести, то программа считает, что все нормально и завершает операцию. Необходимо выдавать ошибку\падать в дамп\что-то еще, чтобы система увидела, что надо отменить изменения

Автор:  skaa [ Чт, дек 15 2016, 14:43 ]
Заголовок сообщения:  Re: Модуль обновления -нарушена транзакционность.

Спасибо!
А в чем тогда плюсы использования модулей обновновления в своих z-транзакциях?
Чем модули обновления лучше чем прямые обновления?

Автор:  Кодер [ Чт, дек 15 2016, 16:20 ]
Заголовок сообщения:  Re: Модуль обновления -нарушена транзакционность.

Цитата:
Чем модули обновления лучше чем прямые обновления?

Именно тем, что они помогают (именно что помогают, т.к. не только они это делают) обеспечить транзакционность изменений.
На прямые изменения БД влияют различный действия ( см. implicit commit work\rollback work в help)

Автор:  Удав [ Чт, дек 15 2016, 22:30 ]
Заголовок сообщения:  Re: Модуль обновления -нарушена транзакционность.

skaa написал(а):
А в чем тогда плюсы использования модулей обновновления в своих z-транзакциях?
Чем модули обновления лучше чем прямые обновления?

Если вы захотите, то любой каскад изменений или пройдет, или нет. Кодер об этом и написал.

Автор:  Parazit [ Пт, дек 16 2016, 00:19 ]
Заголовок сообщения:  Re: Модуль обновления -нарушена транзакционность.

skaa написал(а):
Спасибо!
А в чем тогда плюсы использования модулей обновновления в своих z-транзакциях?
Чем модули обновления лучше чем прямые обновления?

Ничем!
Это один из множества костыликов SAP для решения исторически сложившихся проблем, когда прямое обновление невозможно.
Строго говоря, с точки зрения соблюдения целостности данных, этот механизм нарушает "транзакционный механизм", точнее не гарантирует его.
В остальном всё правильно сказали, ошибка Insert ещё не повод откатывать всю транзакцию, может программист так и задумал, соответственно ему и решать что делать дальше.

Автор:  Kengur [ Пт, сен 22 2017, 15:59 ]
Заголовок сообщения:  Re: Модуль обновления -нарушена транзакционность.

Че то не уловил где тут нарушение транзакционности.

Автор:  Кодер [ Пт, сен 22 2017, 16:36 ]
Заголовок сообщения:  Re: Модуль обновления -нарушена транзакционность.

ТС надеялся, что падение одной операции в модуле perform on commit будет валить всю транзакцию БД. А этого не было.

Автор:  Kengur [ Пт, сен 22 2017, 17:14 ]
Заголовок сообщения:  Re: Модуль обновления -нарушена транзакционность.

Кодер написал(а):
ТС надеялся, что падение одной операции в модуле perform on commit будет валить всю транзакцию БД. А этого не было.

Но не в модуле обновления это будет так же точно работать.

Автор:  Saperx [ Ср, сен 27 2017, 07:57 ]
Заголовок сообщения:  Re: Модуль обновления -нарушена транзакционность.

skaa написал(а):
Спасибо!
А в чем тогда плюсы использования модулей обновновления в своих z-транзакциях?
Чем модули обновления лучше чем прямые обновления?

Если мне не изменяет память, то в SAP есть 2 понятия, имеющих к этому отношение: SAP LUW и DB LUW.
DB LUW как раз таки и отвечает за обновление данных в БД, но время жизни и события завершения этих LUW разные.
Так если SAP LUW живет до момента вызова явного коммита(в общем случае), то DB LUW обладает как явными, так и неявными коммитами/роллбэками.
Как пример, попробуйте сделать что-то типа этого:
Code:
  ls_test-field1 = 'record1'.
INSERT ZTABAP FROM ls_test.

CALL FUNCTION 'ZTEST'
  DESTINATION lv_destination
  EXPORTING
    OK = lv_result.

IF sy-subrc = 0.
  ls_test-field1 = lv_result.
  INSERT ZTABAP FROM ls_test.
  commit work and wait.
ELSE.
  ROLLBACK WORK.
ENDIF.

Следующие операции приводят к неявному коммиту БД, даже если вы не делали Commit work(из того что помню):
Переход между экранами, вызов ФМ по RFC, вывод ошибок(information, error), там что то еще с процессами, но с этим много не работал.
А если вы работали в старом отладчике, то вы должны понимать насколько эти неявные коммиты иногда портят процесс отладки.
Неявные роллбеки: дампы и message A/X, может еще что-то.
Модули обновлений позволяют производить коммит/роллбек одним скопом, например, в многоэкранной транзакции. Где при обычных запросах коммит бы происходил при каждой переходе с экрана на экран.

p.s. Если где не прав, буду благодарен за поправки, сам особо в эту тему не углублялся.

Автор:  Kengur [ Ср, сен 27 2017, 16:10 ]
Заголовок сообщения:  Re: Модуль обновления -нарушена транзакционность.

Нашел тут мегатред viewtopic.php?t=33320

Автор:  Kengur [ Ср, сен 27 2017, 17:05 ]
Заголовок сообщения:  Re: Модуль обновления -нарушена транзакционность.

А тут истина https://help.sap.com/http.svc/rc/abapdo ... ap_luw.htm

Автор:  shirakz [ Вт, янв 26 2021, 20:09 ]
Заголовок сообщения:  Re: Модуль обновления: нарушена транзакционность

Вам нужно было после каждого изменения БД делать проверку sy-subrc и вызывать сообщение с типом 'A', именно такое сообщение откатит все сделанные изменения, ROLLBACK WORK внутри модулей обновления использовать нельзя.
Code:
if sy-subrc is initial.
  message text-a01 type 'A'.
endif.

Страница 1 из 1 Часовой пояс: UTC + 3 часа
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/