Ah ok !
J'ai trouvé :
5. Les niveaux d'isolation
Quel que soit le type de transaction locale ou globale, lors de transactions concurrentes, il se peut que les mêmes données puissent être lues, partagées et modifiées en même temps.
En regard du standard ANSI SQL92, il peut y avoir 3 types de problèmes relatifs aux transactions concurrentes et dans tous les cas les valeurs sont fausses du point de vue de la lecture :
Lecture sale ou " dirty read " : Une transaction lit des données contenant un changement non validé d'une autre transaction. Une partie des données peut se révéler fausse en fonction du commit ou du rollback de l'autre transaction.
Lecture non répétable ou " nonrepeatable reads " : Une transaction lit une donnée, une seconde transaction change la même donnée et la première transaction relit la donnée et obtient une valeur différente. La donnée a changé et est incohérente sur la transaction.
Lecture fantôme ou " phantom reads " : Dans une transaction on ré-exécute une requête, retournant un ensemble de données qui satisfont une condition de recherche. Un nouveau jeu de données apparaît entre les deux opération de lecture.
Au niveau du système de données, il est possible de spécifier au ressource manager le niveau d'isolation transactionnelle pour éviter ce genre d'erreurs.
Ainsi un " isolation level " ou niveau d'isolation défini comment les transactions concurrentes sont isolées les unes des autres à des fins de lecture.
Les niveaux d'isolation suivants sont généralement supportés par les SGBDR ou les systèmes de données d'entreprise (EIS) et ainsi acceptés par les " ressource manager "
TRANSACTION_READ_UNCOMMITTED : La transaction peut lire des données non validées, c'est à dire des données qui ont été modifiées et non validées par des transactions concurrentes. Toutes les erreurs vues ci-dessus peuvent arriver.
Ce niveau est très dangereux dans les environnements stratégiques où des transactions simultanées mettent à jour des données partagées. Il est également inapproprié pour tous les calculs sensibles, comme les opérations de débit/crédit sur comptes bancaires qui doivent adopter un mode d'isolation plus strict.
Ce niveau d'isolation reste approprié si vous savez à l'avance qu'une instance de votre composant ne fonctionne qu'en l'absence de toute autre transaction simultanée. Cependant, dans la plupart des contextes transactionnels, ce niveau d'isolation est insuffisant.
Son principal avantage est la performance, comme le système transactionnel sous-jacent n'a pas besoin de verrouiller les données partagées.
TRANSACTION_READ_COMMITTED : Ce niveau d'isolation fait que l'on ne peut pas lire les changements non validés des transactions concurrentes.
Ce niveau est certainement plus robuste que le mode précédent. Vous ne pouvez plus lire les données écrites, et non validées, ce qui signifie par conséquent que toutes les données que vous lisez sont cohérentes.
Ce mode est fréquemment utilisé pour les programmes qui effectuent des lectures en base pour constituer des rapports sur les valeurs des données.
TRANSACTION_REPEATABLE_READ : Ce niveau d'isolation assure en plus que lire les données plusieurs fois retourneront les mêmes valeurs même si une autre transaction modifie ces données. Les lectures sont répétables.
Ce mode est utile lorsque l'on doit mettre à jour un ou plusieurs éléments de données d'une ressource, comme un ou plusieurs enregistrement d'une BDDR. Il est nécessaire de lire toutes les lignes et de les mettre à jour, en sachant qu'aucune n'est modifiée par d'autres transactions simultanées. Si on choisit de relire l'une de ces lignes ultérieurement au cours de la transaction, on a la certitude qu'elle contient les mêmes données qu'au début de la transaction.
TRANSACTION_SERIALIZABLE : La transaction a les privilèges exclusifs en lecture/ecriture sur des données en les bloquant; les autres transactions ne peuvent ni lire ni écrire sur ces données. C'est le niveau d'isolation le plus contraignant empêchant également les " phantom reads ".
Ce mode doit être utilisé pour les systèmes stratégiques qui exigent une parfaite isolation transactionnelle. Il assure que les données lues ont été validées, que la lecture reste identique au fil du temps et que de mystérieuses données validées n'apparaissent pas dans la base en cours de traitement en raison de transactions simultanées.
Ce niveau d'isolation doit être utilisé avec parcimonie, car il induit un coût certain. Si toutes les opérations sont réalisées dans ce mode, les performances de la base de données ont tendance à se dégrader très rapidement jusqu'à l'immobilisation éventuelle.
Les erreurs transactionnelles relatives aux 3 problèmes cités de lecture erronées pouvant s'avérer très difficiles à détecter, il est également bon d'utiliser ce mode pour s'en détacher complètement.
Récapitulatif des différents niveaux d'isolation et de leurs effets respectifs
Isolation Level Dirty Read Non Repeatable Read Phantom Read
TRANSACTION_READ_UNCOMMITTED possible possible possible
TRANSACTION_READ_COMMITTED aucune possible possible
TRANSACTION_REPEATABLE_READ aucune aucune possible
TRANSACTION_SERIALIZABLE aucune aucune aucune
Ces niveaux d'isolations seront spécifiés aux RM via les outils permettant de gérer les conteneurs EJB, les données objet/relationnelles ou plus directement via les API JAVA.
Donc le TRANSACTION_SERIALIZABLE résoud mon pb ?
Message édité par Shogun2002 le 08-10-2003 à 14:13:14