> > Est tout à fait possible, le seul moyen fiable de garantir l'unicité > > c'est de gérer la contrainte au niveau de la base de donnée. > > Es-tu sur que cela se produit avec l'utilisation que rails fait des > transactions SQL ? >
Tu as raison de douter, mais il n'y a rien de plus simple à vérifier :) 1) Myisam ne supporte pas les transaction, donc à moins d'utiliser les hooks mysql (procédure, intégrité, ON DUPLICATE ...) ou de locker la table tu n'as pas de garantie que 2 requetes distinctes soient executées de facon atomiques 2) Innodb supporte les transactions mais ne garantie absoluement pas le coté atomique de plusieurs transaction distinces exemple: Si on prend l'exemple d'une table innodb users avec un champ email client mysql1: $ mysql -u root database mysql> START TRANSACTION; Query OK, 0 rows affected (0,00 sec) mysql> select * from users where email='[EMAIL PROTECTED]'; Empty set (0,00 sec) mysql> INSERT INTO users set email= '[EMAIL PROTECTED]'; Query OK, 1 row affected (0,08 sec) select * from users where email='[EMAIL PROTECTED]'; +--------------------+ | email | +--------------------+ | [EMAIL PROTECTED] | +--------------------+ 1 row in set (0,00 sec) client mysql2: mysql> START TRANSACTION; Query OK, 0 rows affected (0,00 sec) mysql> select * from users where email='[EMAIL PROTECTED]'; Empty set (0,00 sec) mysql> INSERT INTO users set email= '[EMAIL PROTECTED]'; Query OK, 1 row affected (0,08 sec) select * from users where email='[EMAIL PROTECTED]'; +--------------------+ | email | +--------------------+ | [EMAIL PROTECTED] | +--------------------+ COMMIT; Query OK, 0 rows affected (0,00 sec) client mysql1: COMMIT; Query OK, 0 rows affected (0,00 sec) select * from users where email='[EMAIL PROTECTED]'; +--------------------+ | email | +--------------------+ | [EMAIL PROTECTED] | +--------------------+ | [EMAIL PROTECTED] | +--------------------+ 2 rows in set (0,00 sec) Boom :) ... Les transactions ici empire le problème car allonge le temps où la base de donnée ne possède pas le users avec l'email toto alors que pourtant il va être committé Ce n'est pas un problème de RAILS c'est juste une impossibilité de gérer coté soft des contraintes niveau DB, ceci dit c'est "good enough la plupart du temps" sauf si tu as des requêtes qui prennent des plombes à commiter. Renaud --~--~---------~--~----~------------~-------~--~----~ Vous avez reçu ce message, car vous êtes abonné au groupe "Railsfrance" de Google Groups. Pour transmettre des messages à ce groupe, envoyez un e-mail à l'adresse [email protected] Pour résilier votre abonnement envoyez un e-mail à l'adresse [EMAIL PROTECTED] -~----------~----~----~----~------~----~------~--~---
