Bonjour a tous,
J'ai un petit soucis de concurrence qui me bloque depuis quelques jours.
Voici les techno que j'utilise :
- Spring 3
- Hibernate (via l'interface JPA)
- MySQL (InnoDB)
Voici mon controlleur (Spring MVC) :
Cette méthode est appelée plusieurs fois par seconde.
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 @RequestMapping("/smppMTDS") public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception { String returnStr = receivedMTManager.getUnsentDSReceivedMT(); response.setContentType("text"); PrintWriter out = response.getWriter(); if(null!=returnStr) { out.println(returnStr); } return null; }
"getUnsentDSReceivedMT" est une méthode de ma couche service. La voici :
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 @Transactional(isolation=Isolation.SERIALIZABLE) public String getUnsentDSReceivedMT() { ReceivedMT receivedMT = receivedMTDao.getUnsentDSReceivedMT(); if(receivedMT!=null) { receivedMT.setDsSentTime(new Date()); receivedMTDao.update(receivedMT); return("Id="+receivedMT.getMessageId()+";Status="+receivedMT.getDs()+";"); } return null; }
J'ai besoin que "receivedMTDao.getUnsentDSReceivedMT()" retourne 2 objets différents lorsque 2 requêtes arrive en même temps. Malheureusement ca marche pas : "receivedMTDao.getUnsentDSReceivedMT()" retourne 2 fois la même donnée quand les requêtes arrivent quasiment en même temps. Cela me scotch car je pensais qu'a ce niveau d'isolation (serializable) les objets étaient lockés des la lecture. Est-ce vraiment le cas ?
Si quelqu'un avez une idée ca m'aiderait beaucoup
Note : Pour ce qui sont arrivés jusqu'ici et qui m'ont pas laché entre temps, voici la méthode receivedMTDao.getUnsentDSReceivedMT() :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 public ReceivedMT getUnsentDSReceivedMT() { StringBuilder stringQuery = new StringBuilder(""); stringQuery.append(" FROM ReceivedMT "); stringQuery.append(" WHERE dsSentTime is null "); Query query = sessionFactory.getCurrentSession().createQuery(stringQuery.toString()).setMaxResults(1); return (ReceivedMT) query.uniqueResult(); }
Merci par avance
Sylvain
Partager