Précédent   Forum des professionnels en informatique > Java > Général Java > JDBC
JDBC Forum d'entraide sur l'API JDBC (Java Database Connectivity) et l'accès aux bases de données. Avant de poster -> FAQ JDBC
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 23/12/2011, 14h24   #1
Nouveau Membre du Club
 
Inscription : février 2005
Messages : 177
Détails du profil
Informations forums :
Inscription : février 2005
Messages : 177
Points : 37
Points : 37
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 :
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.
passion_info est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/12/2011, 15h37   #2
Membre éprouvé
 
Homme
Ingénieur développement logiciels
Inscription : avril 2009
Messages : 501
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Sarthe (Pays de la Loire)

Informations professionnelles :
Activité : Ingénieur développement logiciels
Secteur : Service public

Informations forums :
Inscription : avril 2009
Messages : 501
Points : 490
Points : 490
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
oneagaindoguys est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/12/2011, 16h07   #3
Nouveau Membre du Club
 
Inscription : février 2005
Messages : 177
Détails du profil
Informations forums :
Inscription : février 2005
Messages : 177
Points : 37
Points : 37
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.
passion_info est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/12/2011, 16h15   #4
Modérateur
 
Avatar de tchize_
 
Homme
Responsable de service informatique
Inscription : avril 2007
Messages : 16 197
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 32
Localisation : Belgique

Informations professionnelles :
Activité : Responsable de service informatique
Secteur : Service public

Informations forums :
Inscription : avril 2007
Messages : 16 197
Points : 25 343
Points : 25 343
Envoyer un message via MSN à tchize_ Envoyer un message via Skype™ à tchize_
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 :
1
2
3
4
 
INSERT INTO test (cle,valeur) VALUES ('aaa','valeur a');
SELECT cle,valeur,ROWID FROM test;
rollback;
Code x :
1
2
3
4
5
6
1 rows inserted.
CLE                  VALEUR               ROWID 
-------------------- -------------------- ----- 
aaa                  valeur a             AABrQXAAMAACE3lAAA 

rollback complete.
__________________
⥀⥁ Чиз faq java, cours java, javadoc. Pensez à et
"Votre génitrice tute des pédoncules au pandémonium" (le conjurateur, 1973)
tchize_ est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/12/2011, 16h50   #5
Nouveau Membre du Club
 
Inscription : février 2005
Messages : 177
Détails du profil
Informations forums :
Inscription : février 2005
Messages : 177
Points : 37
Points : 37
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" ?
passion_info est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/12/2011, 17h09   #6
Modérateur
 
Avatar de tchize_
 
Homme
Responsable de service informatique
Inscription : avril 2007
Messages : 16 197
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 32
Localisation : Belgique

Informations professionnelles :
Activité : Responsable de service informatique
Secteur : Service public

Informations forums :
Inscription : avril 2007
Messages : 16 197
Points : 25 343
Points : 25 343
Envoyer un message via MSN à tchize_ Envoyer un message via Skype™ à tchize_
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.
__________________
⥀⥁ Чиз faq java, cours java, javadoc. Pensez à et
"Votre génitrice tute des pédoncules au pandémonium" (le conjurateur, 1973)
tchize_ est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/12/2011, 18h45   #7
Nouveau Membre du Club
 
Inscription : février 2005
Messages : 177
Détails du profil
Informations forums :
Inscription : février 2005
Messages : 177
Points : 37
Points : 37
Merci tchize_.
j'ai eu réponse à mes interrogation, je clôture la discussion.
passion_info est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 05h50.


 
 
 
 
Partenaires

Hébergement Web