hello,
J'ai besoin de faire une série de requêtes d'insert, mais si l'un d'entre eux se passe mal il faut faire un roll back.
==> Vous avez compris, j'ai besoin de gérer une transaction au niveau service et non dao.
Mon application est correctement configurée car le code suivant fonctionne (fonctionne car en debug on constate que le commit n'a bien lieu qu'à la fin de updatePerson) :
Par contre si je remonte d'un niveau pour mettre l'annotation @Transactionnal au niveau du service, ça ne le fait plus :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 public class PartyDaoImp extends SqlMapClientDaoSupport implements PartyDaoInt { @Transactional public void updatePerson(Person person) { getSqlMapClientTemplate().update("updateParty", person, 1); getSqlMapClientTemplate().update("updatePerson", person, 1); System.out.println("Person updated"); } }
Je dis que ça ne fonctionne pas car en debug le commit du premier insert est fait alors que le second n'est pas encore exécuté...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 public class MainForTests { public static void main(String args[]) throws Exception { ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("conf/Spring_application_context.xml"); PartyDaoInt partyDAO = (PartyDaoInt) ctx.getBean("partyDAO"); testTransactions(partyDAO); } @Transactional private static void testTransactions(PartyDaoInt partyDAO) throws DataAccessException { Person person = partyDAO.selectPerson(2); person.setGivenNames("bibi1"); partyDAO.insertPerson(person); // commit effectué sans attendre la fin de la procédure... person.setGivenNames("bibi2"); partyDAO.insertPerson(person); } }
J'ai bien sûr passer pas mal de temps à chercher (toute la journée d'hier...) mais là je suis bloqué (vous aurez compris que je n'ai pas d'expérience de spring et les transactions...)
Merci !
Partager