Maison > Questions et réponses > le corps du texte
J'ai un code :
$tx = Yii::$app->db->beginTransaction(); try { // CODE (a lot of active-record reads and writes) $tx->commit(); echo "All good!"; } catch (\Throwable $ex) { $tx->rollback(); echo "Error"; }
Il a été exécuté et j'ai obtenu "Tout va bien !" Cependant, rien n’est réellement stocké dans la base de données. Le code fonctionne depuis plusieurs mois maintenant sans modification. Il a soudainement cessé de fonctionner hier.
Après une heure de débogage, je peux confirmer que l'opération fonctionne correctement et je peux « faire écho » aux résultats intermédiaires, y compris l'ID de l'enregistrement que je souhaite insérer. Mais après la soumission finale, rien n'est enregistré dans la base de données.
Si je supprime la transaction, le code fonctionne et tout est stocké dans la base de données, comme c'était le cas pour les transactions.
Je veux m'assurer de l'intégrité des changements et je souhaite revenir dans la transaction. Ou, du moins, j'aimerais comprendre quel code (ou état de la base de données ou autre) empêche le stockage des données, et pourquoi je ne reçois aucune exception et ne fais écho à "erreur" car la transaction n'a pas pu être validée.
J'étais sûr que la méthode commit() lèverait une exception si la validation de la transaction échouait (en écrivant dans la base de données), mais ce n'est pas le cas. Y a-t-il un moyen de l'obtenir ?
Merci beaucoup d'avance.
P粉7153042392024-03-31 09:04:28
Le problème vient du code. Merci, @Michal Hynčica, vous avez effectivement raison. Il y a une partie comme celle-ci :
foreach (..) { $tx = Yii->$app->db->beginTransaction(); if ($oneRareCondition) { continue; } ... $tx->commit(); }
Par à continue;
之前添加 $tx->commit();
解决了这个很少发生的 if
:
foreach (..) { $tx = Yii->$app->db->beginTransaction(); if ($oneRareCondition) { $tx->commit(); continue; } ... $tx->commit(); }