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.