Je développe une application EJB 3 fonctionnant sur un serveur WildFly 8 avec MySQL. J'ai besoin de mettre à jour un compteur (receiptCounter
) au sein d'une entité (User
) et j'ai décidé de l'essayer avec un appel de procédure stockée pour éviter les conditions de course.Appel de procédure stockée WildFly non persistante dans MySQL
Voilà comment je créé la procédure stockée:
DELIMITER $$
CREATE PROCEDURE increment_receipt_counter
(
IN userID_in INT
)
BEGIN
UPDATE User SET receiptCounter = receiptCounter + 1 WHERE id = userID_in;
SELECT receiptCounter AS receiptCounter_new FROM User WHERE id = userID_in;
END
$$
DELIMITER ;
Voici comment je l'appelle:
import javax.persistence.EntityManager;
import javax.persistence.StoredProcedureQuery;
...
public int incrementReceiptsCounter(int userID) throws InvalidEntityException, UnauthorizedException
{
StoredProcedureQuery q = entityManager.createStoredProcedureQuery("increment_receipt_counter");
q.registerStoredProcedureParameter("userID_in", Integer.class, ParameterMode.IN);
q.setParameter("userID_in", userID);
q.executeUpdate();
return (Integer)q.getSingleResult();
}
La chose étrange est: Quand elle est appelée à partir de Java, la procédure renvoie la nouvelle correcte valeur du compteur, mais la nouvelle valeur n'est pas persistante dans la base de données. Par exemple, si receiptCounter était 1 dans la base de données avant d'appeler la procédure, l'appel de procédure en Java renvoie 2, mais la table User dans la base de données affiche toujours la valeur 1. Lorsque j'appelle la procédure directement depuis la ligne de commande MySQL, ça fonctionne très bien. Qu'est-ce que je fais mal?
Manque de validation? – Shadow