En travaillant avec Websphere Application Serveur et plus particulierement commerce, je me suis retrouvé face à cette erreur :
RegisteredRes E WTRN0063E: An illegal attempt to enlist a one phase
capable resource with existing two phase capable resources has
occurred" when attempting to execute a transaction.
... stack de l'erreur
Plus précisément :
"An attempt was made to have a one-phase resource participate in a
global
transaction while an XA resource or another one-phase resource already
participated
in this global transaction."
Le problème venait du fait que l'on se trouvait au sein d'une
transaction globale (XA). En fait XA est la spécification qui décrit
l'interface entre le Transaction
Manager du serveur d'application et les les manager locaux des
ressources pour pouvoir utiliser JTA (java transaction api).
Concrètement cela permet d'accéder à plusieurs ressources au sein d'une
même transaction.
Dans notre cas, les multiples transactions sont faites à cause des
transactions des EJB. Vu que c'est le container qui doit gérer
automatiquement les transaction des ejb, d'autres appels sont fait (et
donc des transactions créés) vers d'autres ressources lors de
l'execution de la commande RMS. Il faut en fait voir un EJB comme une
nouvelle ressource.
L'appel que je faisais à ma datasource extérieur créait une nouvelle
transaction.
Dans un contexte normal, cette transaction isolée devrait pouvoir
s'executer en tant que non-XA et donc en utilisant un 1PC. Pour raison
obscure propre à la configuration de was (cela doit pouvoir être
modifié, mais je n'ai pas trouvé comment), ce type d'action ne
fonctionne pas de base. Une requête 1PC ne peut pas être utilisée dans
un environnement
Du coup lorsque Transaction Manager fait un commit des transactions des
EJB, il veut utiliser le protocole 2 phase commit pour valider l'envoie
de toutes les transactions des ejb (celle qui lance une exception dans
le tas).
Le driver de cette datasource n'étant pas de type XA, il n'implémentait
pas le protocole
2PC et du coup on avait cette erreur.
La solution consistait donc à changer la classe du driver pour le passer
en XA afin qu'il puisse faire ses 2PC !