Magento 2 è la nuova versione della piattaforma E-commerce che offre nuove e interessanti funzionalità. Tra queste Transaction per salvare oggetti. Una funzionalità poco conosciuta, che risulta però molto utile se si desidera garantire uno stato coerente nel database. Con una singola transazione è possibile combinare molti oggetti da salvare . In tal caso sono possibili due esiti:
Transazione riuscita garantisce che tutte le operazioni SQL all'interno della transazione siano eseguite senza problemi. Quindi i dati sono validi e vengono salvati in db.
Errore di transazione qualcosa è accaduto durante l'esecuzione della transazione. I sistemi di transazione forniscono una funzione chiamata rollback in cui i dati vengono ripristinati all’istante prima dell’inizio della transazione.
Magento 2 in alcuni casi non sembra garantire un comportamento corretto nelle operazioni verso il db. Un esempio è il mal funzionamento con "rollback della transazione asimmetrica", ossia il salvataggio di default di tutte le informazione riguardati più tabelle. Tale malfunzionamento può essere risolto usando alternativamente:TransactionFactory o Custom SQL statement transaction
TransactionFactory
Il seguente codice mostra come utilizzare TransactionFactory in Magento 2: class MyClass { protected $saveTransaction; public function __construct \Magento\Framework\DB\TransactionFactory $transactionFactory ){ $this->saveTransaction = $transactionFactory->create(); } public function saveManyObjects() { ... $this->saveTransaction->addObject($order); $this->saveTransaction->addObject($customer); $this->saveTransaction->addObject($customObject); $this->saveTransaction->save(); } }
Se si esegue il metodo saveManyObjects () di questa classe, tutti gli oggetti specificati vengono salvati contemporaneamente. Per una transazione è necessario iniettare la classe \ Magento \ Framework \ DB \ TransactionFactory, che offre tutte le funzionalità necessarie. È possibile aggiungere oggetti da salvare con il metodo addObject (). Si possono aggiungere oggetti quali: ordini, clienti, prodotti o persino oggetti personalizzati. Tramite il metodo save() viene eseguito automaticamente un commit o una rollback in base all’esito dell’operazione garantendo uno stato coerente dei dati.
Custom SQL statement transactions
Se si vuole usare istruzioni SQL custom utilizzando le transazioni è possibile riferirsi al seguente codice di esempio: $connection = $this->getConnection(); $connection->beginTransaction(); try { ... $connection->commit(); } catch (\Exception $e) { $connection->rollBack(); throw $e; }
È possibile chiamare il metodo beginTransaction () per inizializzare una transazione sull'oggetto “connection” dell'utente. In seguito si possono creare le istruzioni di inserimento o aggiornamento. Con commit () vengono rese persistenti le operazioni sul database. Se qualcosa non è andato a buon fine, il costrutto try catch chiamerà una transaction rollBack per ripristinare uno stato coerente del database e genererà un errore. In conclusione Magento 2 offre tutto il necessario per utilizzare le transazioni. Una transazione è uno strumento utile per rendere sicure le modifiche al database, impedendo di corrompere un database se qualcosa non ha avuto esito positivo.