Mysql transactions dans les transactions
Dans un script PHP de travail avec une base de données mysql, j'ai récemment eu le besoin d'utiliser une transaction à un point qui est arrivé à être à l'intérieur d'une autre transaction. Tous mes tests semblent indiquer que cela fonctionne bien, mais je ne trouve pas de documentation sur ce type d'utilisation.
Je veux être sûr - sont des opérations dans les transactions valides dans mysql? Si oui, est-il un moyen de savoir combien de niveaux vous sont dans les transactions imbriquées? (ie. combien de restaurations qu'il faudrait pour revenir à la normale)
Merci d'avance,
Brian
Vous devez vous connecter pour publier un commentaire.
Cette page du manuel pourrait vous intéresser : 12.3.3. Les instructions Qui Provoquent un Commit Implicite; citant quelques phrases :
Et, un peu plus loin dans la page :
Voir aussi ce paragraphe :
Transactions cannot be nested
dans la même connexion, ou aussi différents?Contrairement à tous les autres répondre, vous pouvez effectivement créer des opérations au sein de transactions et il est vraiment facile. Vous venez de créer point de sauvegarde des emplacements et de l'utilisation de la fonction RESTAURATION À point de sauvegarde pour la restauration d'une partie de la transaction, où point de sauvegarde est le nom que vous donner le point de sauvegarde.
Lien vers la documentation de MySQL: http://dev.mysql.com/doc/refman/5.0/en/savepoint.html
Et bien sûr, aucune de ces requêtes n'importe où dans la transaction devrait être du type qui, implicitement, s'engager, ou l'ensemble de la transaction sera engagé.
Exemples:
En PHP j'ai écrit ce code, et il fonctionne parfaitement:
START TRANSACTION
états, mais laSAVEPOINT
méthode que j'ai grossièrement indiqué dans ma réponse réalise exactement ce qu'est une transaction imbriquée serait. Supposons que vous disposez d'un tableau deroom
les objets que vous souhaitez ajouter à unhouse
objet. Vous pouvez utiliser la base de données des contraintes de décider quand la maison est "plein". Vous pouvez essayer d'ajouter chaque chambre, et obtenir unehouse full
exception une fois qu'il est plein, ce qui peut coïncider avec le modèle de base de données de cracher retour une erreur et restauration "savepointX". "Impossible d'ajouter la 5e salle de bains. Maison Pleine."ROLLBACK TO house9complete
et puis démarrez le bloc suivant. Vous pouvez avoir plusieursROLLBACK
événements en un seul passage à travers le programme. Et en fait, c'est ce que je faissave()
méthode, il aurait pu être sauvé grâce à unedb
objet qui aurait unetransactionLevel
de la propriété. De cette façon, n'importe quel objet enregistré peut créer un roll back-mesure du point d'enregistrement. Ledb
objet prend soin de tous les point d'enregistrement de noms et de nidification. Si aucune transaction n'est commencé, il émetSTART TRANSACTION
, sinon, il crée unSAVEPOINT
. Il y a d'autres solutions. Mais à l'aide de laSAVEPOINT
dans toute solution permettra de beaucoup mieux DB cohérence.Pas.
MySql ne supporte pas les transactions imbriquées. Il ya quelques façons que vous pouvez émuler bien. Tout d'abord, vous pouvez utiliser les points d'enregistrement comme une forme de transaction, de sorte que vous offre deux niveaux de transactions; j'ai utilisé pour ce test, mais je ne suis pas sûr que sur les limitations, si vous l'utilisez dans le code de production. Une solution plus simple est d'ignorer la deuxième
begin transaction
et au lieu d'augmenter un compteur. Pour chaquecommit
, vous la diminuez. Une fois que vous atteint zéro, vous faire une réellecommit
. Il y a des limites évidentes de cette, par exemple. un rollback va rouler tous opérations de retour, mais pour un cas où vous utilisez uniquement des opérations pour la gestion des erreurs, qui peuvent être acceptables.Il y a quelques grandes réponses dans ce thread, cependant, si vous utilisez innoDB comme MySQL et de moteur de stockage sont de l'utilisation de MySQL 5.0.3 ou plus, vous obtenez des transactions imbriquées à droite de la boîte sans avoir besoin d'aucun travail supplémentaire de votre part ou de toute de la fantaisie des techniques décrites par d'autres dans ce fil.
À partir de la base de docs sur les Transactions XA:
Mon Transactions XA Exemple, Juste Pour Vous:
Documentation de MySQL Pour les Transactions XA:
Les Transactions
La syntaxe
I <3 Transactions XA 4 Eva!
Vous pourriez vouloir vérifier vos tests methadology. En dehors de MaxDB, MySQL ne supporte pas quelque chose à distance comme les transactions imbriquées.
Il n':
http://dev.mysql.com/doc/refman/5.0/en/xa.html