Cerca nel blog

lunedì 7 settembre 2015

ABAP: Lock Object (ENQUEUE, DEQUEUE)

Definizione

I Lock Objects sono utilizzati in SAP, per evitare l’inconsistenza dei dati al momento dell’inserimento/modifica nel database.
Sap fornisce 3 tipi di Lock objects:
  •                 Read Lock (Shared Locked). Questo Lock permette alle altre transazioni di accedere in lettura ma non in scrittura sull’area della tabella loccata.
  •                 Write Lock (Shared Locked). Questo Lock NON permette alle altre transazioni di accedere né in lettura né in scrittura sull’area della tabella loccata.
  •                 ExclusiveLock without cumulating. Questo Lock è simile al WRITE LOCK, ma inoltre NON permette alla stessa transazione eseguita in un’altra sessione, di accedere né in lettura né in scrittura sull’area della tabella loccata.
È possibile creare un lock su un oggetto di SAP attraverso la transazione SE11 e immettere un nome significativo che inizia con EZ (ad esempio: EZKERCR_RECD).
Quando si crea un lock oggetto, il sistema crea automaticamente due FM:
  •                 ENQUEUE_<Lockobject name>. Per inserire l’oggetto nella cosa (queue).
  •                 DEQUEUE_<Lockobject name>. Per rimuovere l’oggetto dalla coda.
Questi due FM, devono essere usati nel programma rispettivamente prima di modificare la tabella e dopo la modifica della tabella.
Il Lock, nell’ambito di una stessa tabella, può essere gestito diversamente:
  •                 Se si specificano tutti i campi chiave della tabella, il lock è un lock di riga, che blocca la singola occorrenza che l’utente che gestisce il lock sta trattando;
  •                 Se si specificano solo alcuni campi, il lock è un lock generico, che blocca solo una parte della tabella, solo determinate occorrenze, che presentano certi valori nei campi specificati nella definizione dell’oggetto di lock;
  •                 Se non si specifica alcun campo, il lock è completo,  su tutta la tabella.


Esempio: Creazione di un Lock di Riga 

Supponiamo vi voler creare un Lock di Riga per la tabella custom ZKERCA_101_RECD.
Richiamiamo la transazione SE11, inseriemo nel Lock objetc il valore "EZKERCR_RECD" e premiamo il pulsante CREATE


Inseriamo la descrizione, la tabella su cui creare il Lock, ed i lflag "X Exclusive", poi selezionare il TAB "Lock Parameter"


Inserire i campi chiave della tabella su cui effettuare il Lock di riga:




VISUALIZZAZIONE DEI LOCK SULLA TABELLA  CHE ABBIAMO LOCCATO

 È possibile vedere tali lock sulla tabella interessata tramite la transazione SM12.


FM DA RICHIAMARE ALL'INTERNO DEI PROGRAMMI PER LOCCARE TABELLA


 CALL FUNCTION 'ENQUEUE_EZKERCR_RECD'
      EXPORTING
        mandt                = sy-mandt
        transaction_id       = ls_dest-transaction_id
        iban                 = ls_dest-iban
        e_seq_no             = ls_dest-e_seq_no
        cdt_dbt_ind          = ls_dest-cdt_dbt_ind
        t_endtoend_id        = ls_dest-t_endtoend_id
      EXCEPTIONS
        foreign_lock         = 1
        system_failure       = 2
        OTHERS               = 3.
    IF sy-subrc <> 0.

    ENDIF.


FM DA RICHIAMARE ALL'INTERNO DEI PROGRAMMI PER UNLOCCARE TABELLA


    CALL FUNCTION 'DEQUEUE_EZKERCR_RECD'     
     EXPORTING       
       mandt                       = sy-mandt       
       transaction_id       = ls_dest-transaction_id       
       iban                 = ls_dest-iban       
       e_seq_no             = ls_dest-e_seq_no       
       cdt_dbt_ind          = ls_dest-cdt_dbt_ind       
       t_endtoend_id        = ls_dest-t_endtoend_id.   
     
    IF SY-SUBRC <> 0.
     ENDIF.



Nessun commento:

Posta un commento