2010-01-18 4 views
4

Étant donné:comportement des transactions de MySQL/PHP

mysql_query("START TRANSACTION"); 
mysql_query("UPDATE foo = 'bar'"); 
die(); 

die() arrête la transaction avant que je puisse COMMIT ou ROLLBACK. En regardant mes tables, il apparaît que la mise à jour n'a pas lieu, mais si j'exécute des requêtes plus tard dans un autre script, est-ce qu'elles font toujours partie de cette transaction initiale? La transaction est-elle encore 'ouverte' jusqu'à ce que j'aie COMMIT ou ROLLBACK?

Répondre

4

Si die tue la connexion à mysql alors oui, la transaction est fermée. Si vous laissez simplement la transaction en suspens, vous aurez des problèmes.

Je vous recommande de vous assurer que la transaction et le commit sont dans la même requête mysql si cela est humainement possible pour s'assurer que cela se produise réellement.

+0

Selon http://www.php.net/manual/en/function.mysql-close "L'utilisation de mysql_close() n'est généralement pas nécessaire, car les liens ouverts non persistants sont automatiquement fermés à la fin de l'exécution du script. " Puisque die() termine l'exécution du script, je suppose que cela signifie que la connexion à la base de données est fermée? – Matthew

+0

Et malheureusement, je n'utilise pas mysqli, donc je ne peux pas faire plusieurs requêtes à la fois. – Matthew

+0

C'est exact, je me demandais juste si vous alliez vraiment être complètement fidèle à propos de toujours mourir après votre transaction a été ouverte. Je veux dire, à quelle fréquence vas-tu vraiment mourir() dans un scénario réel? C'est pourquoi j'ai mentionné que vous ne devriez probablement pas compter sur die() pour conclure une transaction pour vous. –

1

Cela dépend de votre niveau de sérialisation. Si une transaction n'est ni validée ni annulée, elle doit expirer après un certain temps et être annulée dans la base de données. Mais jusque là, il s'agit d'une transaction inachevée qui pourrait provoquer des sélections incohérentes dans d'autres transactions non sérialisables. En fonction de c'est level:

  • lecture non validée: vous pouvez lire les valeurs non validées, inachevées jusqu'à rollback
  • lecture répétée (par défaut mysql): vous ne serez pas lire les valeurs non validées, mais les plages ne sont pas verrouillés, une SELECT COUNT (*) FROM clients WHERE 18 ans et l'âge < < 24 ne sont pas garantis pour renvoyer des valeurs cohérentes jusqu'à ce que rollback
Questions connexes