L'ORM Eloquent est très bien, mais je me demande s'il existe un moyen facile de configurer les transactions MySQL en utilisant innoDB de la même manière que PDO, ou si je dois étendre l'ORM pour rendre cela possible ?
Réponses
Trop de publicités?Pour une raison quelconque, il est assez difficile de trouver cette information quelque part. J'ai donc décidé de la publier ici, car mon problème, bien qu'il soit lié aux transactions Eloquent, était exactement le même.
Après avoir lu CE réponse de stackoverflow, j'ai réalisé que mes tables de base de données utilisaient MyISAM au lieu d'InnoDB.
Pour que les transactions fonctionnent sur Laravel (ou n'importe où ailleurs, semble-t-il), il est nécessaire que vos tables soient configurées pour utiliser InnoDB.
Pourquoi ?
Citer MySQL Transactions et opérations atomiques docs ( aquí ) :
MySQL Server (version 3.23-max et toutes les versions 4.0 et supérieures) prend en charge les transactions avec les moteurs de stockage transactionnel InnoDB et BDB. InnoDB offre une conformité ACID complète. Voir le chapitre 14, Moteurs de stockage. Pour plus d'informations sur les différences entre InnoDB et SQL standard en ce qui concerne le traitement des erreurs de transaction, voir la Section 14.2.11, " Gestion des erreurs InnoDB ".
Les autres moteurs de stockage non transactionnels de MySQL Server (tels que MyISAM) suivent un paradigme différent pour l'intégrité des données appelé "opérations atomiques". En termes transactionnels, les tables MyISAM fonctionnent effectivement toujours en mode autocommit = 1. Les opérations atomiques offrent souvent une intégrité comparable avec des performances supérieures.
MySQL Server prenant en charge les deux paradigmes, vous pouvez décider si vos applications sont mieux servies par la vitesse des opérations atomiques ou par l'utilisation des fonctionnalités transactionnelles. Ce choix peut être fait pour chaque table.
Si une exception se produit, la transaction sera automatiquement annulée.
Format de transaction de base de Laravel
try{
DB::beginTransaction();
/*
* SQL operation one
* SQL operation two
..................
..................
* SQL operation n */
DB::commit();
/* Transaction successful. */
}catch(\Exception $e){
DB::rollback();
/* Transaction failed. */
}
- Réponses précédentes
- Plus de réponses