Nous observons un comportement étrange dans nos transactions de base de données - elles ne se comportent pas de manière atomique. Nous utilisons MySQL 5.6.25 Innodb, Eclipselink 2.5.2 comme fournisseur JPA et HikariCP 2.6.2 comme pool de connexions.Comportement non-atomique Eclipselink- Les transactions DB sont à moitié validées
Ce problème se produit lorsque Eclipselink ne parvient pas à acquérir une connexion du pool au cours d'un appel entityManager.flush. Pendant un certain temps, nous avons avalé cette exception parce que l'entrée à une table particulière était faite sur la base du meilleur effort - une sorte de mode d'audit que vous pouvez dire. Cependant, cela a conduit au cas où seule une partie de la transaction a été engagée - sur 5, seules 1,2 ou 3 entrées ont été conservées.
Pour être sûr, voici le déroulement des événements
tx.begin();
em.persist(entity1);
try{
em.persist(entity2);
em.flush(); ---> this is where connection acquisition fails.
} catch(Throwable tx){
//do nothing, except log.
}
em.persist(entity3);
em.flush();
em.persist(entity4);
em.flush();
em.persist(entity5);
em.flush();
em.persist(entity6);
tx.commit();
Nous voyons des transactions engagées jusqu'à entity3, entity4, entity5, lors de l'acquisition de connexion échoue à nouveau à un moment donné Quintes plus tard. Est-ce que quelqu'un peut indiquer comment cela se passe exactement?
différents backends mysql ont un comportement différent, certains n'ont pas de transactions ACID. Ce que Vous utilisez (innodb, myisam etc) –
Innodb. Permettez-moi de mentionner cela dès le départ. – user20507
Vous ne pouvez pas attraper une exception de flush et continuer avec la transaction. – Chris