Pour effectuer une transaction, les tables d’un model doivent être d’un type qui supporte les transactions.
Toutes les méthodes de transaction doivent être effectuées sur un objet de Source de Données. Pour obtenir le model de Source de Données à partir du model, utilisez:
$dataSource = $this->getDataSource();
Vous pouvez utiliser la source de données pour commencer, committer, ou faire des roll back des transactions.
$dataSource->begin();
// Effectue certaine tâche
if (/*all's well*/) {
$dataSource->commit();
} else {
$dataSource->rollback();
}
Il est possible de commencer une transaction plusieurs fois en utilisant la
méthode Datasource::begin()
. La transaction va seulement finir
quand le nombre de commit et de rollback correspond à ceux du début:
$dataSource->begin();
// Exécute quelques tâches
$dataSource->begin();
// Quelques tâches en plus
if (/*la dernière tâche ok*/) {
$dataSource->commit();
} else {
$dataSource->rollback();
// Changer quelque chose dans la tâche principale
}
$dataSource->commit();
Cela va réaliser une réelle transaction imbriquée si votre base de données le supporte et qu’elle est activée dans la source de données. Les méthodes vont toujours retourner true quand on est en mode transaction et quand l’imbrication n’est pas supportée ou désactivée.
Si vous voulez utiliser plusieurs démarrages mais ne pas utiliser la
transaction imbriquée à partir de la base de données, désactivez-la en
utilisant $dataSource->useNestedTransactions = false;
. Elle ne va utiliser
que la transaction globale.
La transaction réelle imbriquée est désactivée par défaut. Activez-la en
utilisant $dataSource->useNestedTransactions = true;
.