logo

Dodatni tipovi blokova (EBT) - Novo iskustvo rada sa Layout Builder-om❗

Dodatni tipovi blokova (EBT) – stilizovani, prilagodljivi tipovi blokova: slajdšouvi, kartice sa tabovima, kartice, akordeoni i mnogi drugi. Ugrađena podešavanja za pozadinu, DOM Box, javascript dodatke. Iskusite budućnost kreiranja rasporeda već danas.

Demo EBT moduli Preuzmite EBT module

❗Dodatni tipovi pasusa (EPT) – Novo iskustvo rada sa pasusima

Dodatni tipovi pasusa (EPT) – analogni skup modula zasnovan na pasusima.

Demo EPT moduli Preuzmite EPT module

Scroll
18/06/2025, by Ivan

Drupal takođe podržava transakcije, uključujući transparentnu rezervnu opciju za baze podataka koje ne podržavaju transakcije. Međutim, transakcije mogu biti prilično komplikovane ako pokušate pokrenuti dve transakcije istovremeno. Ponašanje u ovom slučaju takođe zavisi od baze podataka.

Sličan problem postoji sa ugneždenim zaključavanjima u C/C++. Ako kod već poseduje zaključavanje A i pokuša da ponovo dobije zaključavanje A, kod će biti blokiran. Ako pišete kod koji proverava da li već ima zaključavanje i ne pokušava ga ponovo dobiti, izbegavate mrtvu petlju, ali možete premalo otključati.

U SQL imamo isti problem. Ako je vaš kod već u transakciji, pokretanje nove transakcije ima neočekivanu i neželjenu posledicu izvršavanja trenutne transakcije i pokretanja nove.

Java rešava problem ugneždenosti svojim zaključavanjima tako što implementira podršku za strukturu ugneždenosti, slično onome što testiramo ispod. Java omogućava označavanje funkcija kao „sinhronizovanih“, što tera funkciju da sačeka dobijanje zaključavanja pre pokretanja i da otključa kada više nije potrebno. Ako jedna sinhronizovana funkcija pozove drugu u istom klasu, Java prati ugneždenost zaključavanja. Spoljna funkcija dobija zaključavanje, unutrašnja ne radi zaključavanja, a spoljna funkcija otključava nakon povratka.

Iako u PHP ne možemo deklarisati funkcije kao „transakcione“, možemo emulirati logiku ugneždenosti Jave koristeći objekte sa konstruktorima i destruktorima. Funkcija jednostavno poziva „$transaction = $connection->startTransaction()“ kao prvu (ili skoro prvu) operaciju da bi postala transakciona. Ako jedna transakciona funkcija pozove drugu, naš sloj apstrakcije transakcija ih ugnežđuje, ne izvršavajući transakcione operacije (koliko baza vidi) unutar unutrašnjih nivoa ugneždenosti.

Da biste započeli novu transakciju, jednostavno pozovite $transaction = $connection->startTransaction(); u svom kodu. Transakcija će ostati otvorena dok promenljiva $transaction postoji u opsegu. Kada se $transaction uništi, transakcija će biti potvrđena. Ako je vaša transakcija ugnežđena u drugu, Drupal prati svaku transakciju i potvrđuje samo najspoljniju kada poslednji objekat transakcije izađe iz opsega, tj. kada su svi odgovarajući upiti uspešno završeni.

Morate dodeliti vrednost vraćenu od $connection->startTransaction(); promenljivoj, kao u primeru. Ako pozovete metodu bez dodeljivanja vraćene vrednosti promenljivoj, vaša transakcija će se odmah potvrditi i postaće beskorisna.

Otkazivanje transakcije kontroliše objekat konekcije ($connection->rollBack()) u Drupalu 8, ali se obično treba izvršiti preko metode-omotača transakcije ($transaction->rollBack()). Razlog zbog kojeg to treba činiti pomoću rollBack() metode transakcije je zato što ona poništava tu transakciju po imenu, dok $connection->rollBack() podrazumevano koristi ime drupal_transaction i može dati neželjene rezultate pri korišćenju sa ugneždenim transakcijama.

 Primer:

function my_transaction_function() {

  // Transakcija se otvara ovde.
  $transaction = $connection->startTransaction();

  try {
    $id = $connection->insert('example')
      ->fields([
        'field1' => 'mystring',
        'field2' => 5,
      ])
      ->execute();

    my_other_function($id);

    return $id;
  }
  catch (Exception $e) {
    $transaction->rollBack();
    watchdog_exception('my_type', $e);
  }

  // Možete dozvoliti da $transaction izađe iz opsega ovde i transakcija će
  // automatski biti potvrđena ako nije već poništena.
  // Međutim, ako imate još posla, želite da sami potvrdite transakciju,
  // kao u ovom primeru:
  $transaction->commit();

  // Još koda ovde van transakcije.
}

function my_other_function($id) {
  // Transakcija je još uvek otvorena ovde.

  if ($id % 2 == 0) {
    $connection->update('example')
      ->condition('id', $id)
      ->fields(['field2' => 10])
      ->execute();
  }
}

 

Source URL:

Drupal’s online documentation is © 2000-2020 by the individual contributors and can be used in accordance with the Creative Commons License, Attribution-ShareAlike 2.0. PHP code is distributed under the GNU General Public License.