IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

JDBC Java Discussion :

Traitement transactionnel de bout en bout


Sujet :

JDBC Java

  1. #1
    Membre régulier
    Inscrit en
    Février 2005
    Messages
    177
    Détails du profil
    Informations forums :
    Inscription : Février 2005
    Messages : 177
    Points : 71
    Points
    71
    Par défaut Traitement transactionnel de bout en bout
    Bonjour à tous,
    j'ai 3 traitements JAVA qui agissent sur 2 tables:
    1)- sélection d'un ensemble de lignes de la table 1 et update du Flag de ces lignes.
    2)- création d'enregistrement dans la table 2.
    3)- récupération des row_id des lignes créées et mis à jour dans la table 1 des lignes correspondantes.
    Je souhaite que mon traitement se fasse de bout en bout et que s'il y a problème que je puisse rollbacker toute la transaction( sachant que je dois commiter dans l'étape 2 pour que je suisse récupérer les row_id).
    voici le code,sachant que j'ai anonymisé le code au maximum mais l'idée est là;
    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
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    public class Traitement {
    		protected int etape1(Connection conn)throws SQLException {
         		String req = "requete selection et update";			
    			Statement stmt = conn.createStatement();
    			int nbUpd  = stmt.executeUpdate(req);
    			stmt.close();
    			return nbUpd; 
    		}
    		protected int etape2(Connection conn)throws SQLException {			
    			String req = "ma requete d'update";
    			Statement stmt = conn.createStatement();
    			int nbInsert = stmt.executeUpdate(req);
    			stmt.close();
    			return nbInsert;
    		}	
    		protected int etape3(Connection conn) throws  SQLException {
    			String req = "requete de report des row_id";
    			Statement stmt = null;
    			try {
    				stmt = conn.createStatement();
    				int nbUpd = stmt.executeUpdate(req);				
    				return nbUpd;
    			} catch (SQLException sqle) {
    				throw sqle;
    			} finally {
    				if(stmt != null) {
    					try {
    						stmt.close();
    					} catch (SQLException sqle1) {
    						throw sqle1;
    					} 
    				}
    			}
    		}
    		public void méthodeDAppel() {
     
    			Connection conn=null;
    			try {
    				String url = "url de conenction à la base de données";
    				conn = DriverManager.getConnection(url,"","");
    				int result1 = etape1(conn);
    				if (result1 > 0) {
    					//Etape 1
    					int result2 = etape2( conn);		
    					// Report de l'identifiant 
    					int result3 = etape3(conn);
    				}
     
    			} catch ( SQLException sqle ) {
    				try {
    					conn.rollback();
    				} catch (SQLException e) {
    					e.printStackTrace();
    				}
    			}
     
    		}
    j'aimerais avoir votre avis sur ce qui a été fait:
    -Structurellement es-ce bon !
    -Es-ce que le traitement s’exécute comme une seule unité transactionnelle? si par exemple il y a un lock sur la table1, y aurait-il un problème au niveau de l'étape 3.

    Merci par avance.

  2. #2
    Membre confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    540
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vendée (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2009
    Messages : 540
    Points : 532
    Points
    532
    Par défaut
    Je ne vois pas l'instruction START TRANSACTION au début du traitement.

    Ensuite, pour les commit et rollback, c'est aussi des instruction sql

  3. #3
    Membre régulier
    Inscrit en
    Février 2005
    Messages
    177
    Détails du profil
    Informations forums :
    Inscription : Février 2005
    Messages : 177
    Points : 71
    Points
    71
    Par défaut
    merci oneagaindoguys de ta réponse,
    en réalité, le traitement qui est appelé utilise un framework fait maison pour la gestion des transactions et c'est lui qui est responsable de l’initialisation des transactions, de les committer et de les roolbacker si erreur.
    et concretement le traitement en question est appelé au sein d'une classe qui implemente une interface spacifique et c'est à ce niveau là que ce fait la gestion de la transaction (initialisation, commit/roolback) et donc le rollback est en fait situé à un niveau plus haut , la méthode "méthodeDAppel" se contente de renvoyé l'exception.

  4. #4
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    Citation Envoyé par passion_info Voir le message
    sachant que je dois commiter dans l'étape 2 pour que je suisse récupérer les row_id
    Il n'y a pas de raison.
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    insert into test (cle,valeur) values ('aaa','valeur a');
    select cle,valeur,ROWID from test;
    rollback;
    Code x : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    1 rows inserted.
    CLE                  VALEUR               ROWID 
    -------------------- -------------------- ----- 
    aaa                  valeur a             AABrQXAAMAACE3lAAA 
    
    rollback complete.

  5. #5
    Membre régulier
    Inscrit en
    Février 2005
    Messages
    177
    Détails du profil
    Informations forums :
    Inscription : Février 2005
    Messages : 177
    Points : 71
    Points
    71
    Par défaut
    merci tchize_, c'est ok pour ce point.
    question sur les accès concurrent ? si il y a un lock au niveau de la table1 avant de passer à l'étape 3;
    -quelle est le temps maximum que peut rester une requête en "wait" ?

  6. #6
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    ca dépend de la configuraiton de la DB. Si c'est du oracle, je pense qu'il n'y a pas de timeout puisque oracle détecte automatiquement les deadlocks.

  7. #7
    Membre régulier
    Inscrit en
    Février 2005
    Messages
    177
    Détails du profil
    Informations forums :
    Inscription : Février 2005
    Messages : 177
    Points : 71
    Points
    71
    Par défaut
    Merci tchize_.
    j'ai eu réponse à mes interrogation, je clôture la discussion.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Gmail : bientôt un chiffrement des mails de bout en bout avec PGP ?
    Par Stéphane le calme dans le forum Sécurité
    Réponses: 20
    Dernier message: 12/06/2014, 15h09
  2. Réponses: 0
    Dernier message: 25/01/2013, 12h02
  3. Réponses: 0
    Dernier message: 01/09/2010, 11h44
  4. Réponses: 4
    Dernier message: 06/01/2009, 23h42
  5. sequences mise bout a bout
    Par sheeVaa dans le forum Flash
    Réponses: 3
    Dernier message: 16/02/2007, 11h20

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo