Bonjour à tous. je reprends un soft écrit en java/jdbc/mysql et donc un bon bug (pour moi) d'entrée à corriger et là c bloquant / limite grave car le truc tourne en production....

Contexte
Le but est de traiter des transactions (x par minute).
Dans le but d'être performant, ces traitements ont été parallélisés.

Thread principal
Ouverture de la connection sur mysql
Tant que (pas fin)
Attente d'une transaction
Traitement de la transaction (connection)
Clôture de la connection
Sortie

Thread de traitement
Création statement
statement.executeUpdate ("insert... <transaction in table>")
Récupération de la dernière position dans la table qui devient la ref unique de la transaction
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
17
18
    try
    {
      rs = stm.executeQuery("SELECT LAST_INSERT_ID()");
      if (rs.first())
      {
        txid= rs.getInt(1);
      }
      else
      {
        txid = -1;
      }
    }
    catch (SQLException e)
    {
     ..
    }
 
  system.out.println ("transaction id="+txid); //transaction id=28232
Traitements ...
Clôture statement
Sortie

Le pb est que pour deux transactions arrivant en même temps, dans les deux threads on obtient le même transaction id, ce qui est rare le restant du temps car il y a à peu près 1 transaction toutes les 5 secondes, mais qd on va arriver à plusieurs par seconde je crains d'entrée le résultat.
En fait le 2° récupère le transaction id du premier et là c la mayonnaise.

Il faudrait que le premier insert s'exécute totalement pour que le 2° récupère le rang mis à jour (je cherche quelque chose pour que ce soit l'un derrière l'autre style criticalsection ou equivalent ou mettre un commit en fait je ne sais pas je chercher cherche ..)