2010-06-02 4 views
2

Je voudrais que mon programme puisse installer des plugins et annuler toutes les modifications apportées en cas d'erreur. Je crée donc une transaction qui conserve toutes les choses qui ont été ajoutées lors de l'installation du plugin. Le problème est que le plugin peut vouloir créer des tables, ce qui valide automatiquement la transaction en cours dans MySQL.MySQL Créer des tables sans valider la transaction en cours

Voir Statements That Cause an Implicit Commit sur le site Web de MySQL.

Une idée sur comment je pourrais le faire? J'ai pensé utiliser des tables temporaires car elles ne sont pas automatiquement validées, sauf si elles utilisent trop de mémoire, mais il semble que les tables temporaires ne puissent pas être annulées de toute façon (et je n'ai pas trouvé un moyen de les convertir en permanent). les tables).

Je viens de découvrir "save points", mais je ne comprends pas vraiment comment/quand il doit être utilisé ni s'il peut m'aider à réaliser ce que je veux.

Répondre

2

Les points de sauvegarde ne sont pas la solution; ils sont engagés lorsque la transaction est validée. Un point de sauvegarde est un point intermédiaire d'une transaction à laquelle vous pouvez revenir.

Certains SGBD fournissent une prise en charge complète des transactions sur les instructions DDL (langage de définition de données), telles que CREATE TABLE. IBM Informix Dynamic Server en est un exemple.

De nombreux SGBD ne vous fournissent pas un tel support. L'un est Oracle. Fondamentalement, vous devez décider s'il est préférable d'utiliser/supporter MySQL et de vivre sans support de transaction autour des instructions DDL ou si vous devez migrer vers un autre SGBD offrant les fonctionnalités dont vous avez besoin. Il y a, en théorie, une troisième option - ajouter un support pour les transactions autour de DDL dans MySQL. Cela pourrait être un peu difficile, mais (mais immensément utile pour la communauté MySQL dans son ensemble si vous le faites correctement).

+0

OK merci pour l'info. Je ne savais même pas Oracle ne le supportait pas. Mon application utilise une couche abstraite qui permet de supporter différents SGBD, donc je ne peux pas vraiment creuser dans chacun d'entre eux et ajouter le support à la transaction complète sur DDL ... et même si c'était juste MySQL, ce serait probablement trop complexe pour moi! – user276648

Questions connexes