21 января 2022

Про database commit и rollback

Про database commit и rollback.

  SELECT SINGLE * FROM ztest_01 INTO @DATA(ls_test_01) WHERE id = '5'.
  ls_test_01-lastname = |{ sy-datum }-{ sy-uzeit }|.

  MODIFY ztest_01 FROM ls_test_01.

  " Неявный database commit
  " Передача управления SAP GUI
  " Например, переход к экрану
  CALL SCREEN 0110.

  " Сообщение типа I, W, E
  MESSAGE 'Message' TYPE 'I'.

  " Вызов RFC ФМ, а также возврат из RFC ФМа
  CALL FUNCTION 'Z_TEST_01_BKG'
    DESTINATION 'NONE'
    EXPORTING
      is_test_01 = VALUE ztest_01( ).

  " Явный database commit
  " Вызов COMMIT WORK
  COMMIT WORK.

  " Вызов ФМ DB_COMMIT
  CALL FUNCTION 'DB_COMMIT'.  

  " Неявный database rollback
  " Сообщение типа A, X
  MESSAGE 'Message' TYPE 'A'.

  " Runtime error

  " Явный database rollback
  " Вызов ROLLBACK WORK.
  ROLLBACK WORK.

  " Вызов ФМ DB_ROLLBACK
  CALL FUNCTION 'DB_ROLLBACK'.

Если до коммита сделать выборку данных из БД, то получим обновленные данные, хотя database commit ещё не выполнен.

  SELECT SINGLE * FROM ztest_01 INTO @DATA(ls_test_01) WHERE id = '5'.
  ls_test_01-lastname = |{ sy-datum }-{ sy-uzeit }|.

  MODIFY ztest_01 FROM ls_test_01.

  SELECT SINGLE * FROM ztest_01 INTO @DATA(ls_test_01_new) WHERE id = '5'.

  " В ls_test_01_new-lastname будет значение ls_test_01-lastname

Операторы изменения данных в БД устанавливают блокировку на запись(и). Если до окончания database commit другой процесс будет изменять те же данные, возникнет database lock, которая снимется, когда закончится процесс, установивший блокировку.

Комментариев нет:

Отправить комментарий