2010-07-03 2 views
8

Je commence une transaction.Puis-je récupérer des requêtes en attente pendant une transaction InnoDB?

Ensuite, j'ai besoin de revenir en arrière. Puis-je avoir une liste des requêtes qui sont "rejetées" de cette façon?

(ps: bien sûr je peux les connecter au préalable, je me demandais si cela pouvait se faire d'une manière plus « naturelle »)

+0

Je pense que le moyen naturel est de les enregistrer au préalable. Si vous ne savez pas ce que fait la transaction, comment pouvez-vous savoir que vous voulez la restaurer? –

Répondre

1

Si vous utilisez InnoDB, jetez un oeil à la InnoDB monitor et stderr. Je pense que la meilleure pratique est de les stocker dans l'application (serveur), car elle ne dépendra pas de la plate-forme.

2

Si vous êtes sur un MySQL récent 5.1, cela devrait fonctionner:

SHOW ENGINE ETAT INNODB comprend une liste de transactions actives pour le moteur InnoDB. Chacun d'eux est préfixé avec un identifiant de transaction et un identifiant de processus, et ressemble un peu à ceci:

---TRANSACTION 0 290328284, ACTIVE 0 sec, process no 3195, OS thread id 
34831 rollback of SQL statement 
MySQL thread id 18272 
<query may be here> 

L'identifiant de fil MySQL correspondra au CONNECTION_ID() de votre session, que vous pouvez obtenir de SHOW FULL PROCESSLIST ou information_schema .processlist, de sorte que vous pouvez déterminer quelle transaction est la vôtre. Vous devrez analyser le texte et analyser la requête si elle est présente. Si cela ne vous suffit pas, vous pouvez essayer quelque chose comme SET @PROGRESS = @PROGRESS + 1 avant chaque instruction ROLLBACK, puis SELECT @PROGRESS de DUAL à la fin de votre requête pour savoir jusqu'où la transaction est passée avant frapper une restauration.

+0

malencontreusement 'ERROR 1227 (42000): Accès refusé; Vous avez besoin du privilège SUPER pour cette opération »:( –

+0

De plus, il n'y a pas de requête de toute façon:/ –

+0

Si votre requête est rapide, elle risque de glisser trop rapidement pour que cette méthode fonctionne.Vous pouvez essayer le moniteur InnoDB comme suggéré par Marcus, mais si votre requête est rapide, vous devrez peut-être définir l'intervalle de surveillance comme étant très petit! –

Questions connexes