Visualizzazione dei risultati da 1 a 6 su 6
  1. #1
    Utente di HTML.it
    Registrato dal
    Feb 2006
    Messaggi
    258

    Transazione in java..

    Salve ragazzi,
    avrei un semplice quesito da porvi che mi sta però facendo impazzire.
    Ho realizzato un'applicazione web in jsf, l'utente inserisce attraverso 6 pagine di form numerosi dati che vengono raccolti in un numero variabile di prepared statements e memorizzati in un arraylist di prepared statements.
    Quando l'utente termina le operazioni,e solo alla fine, viene invocato il metodo executeTransaction che scorre l'arraylist ed esegue gli statement, effettuando commit o rollback di conseguenza. Il problema è che non riesco a far funzionare la transazione!Se metto o ometto il commit o il rollback non cambia niente!
    Cmq se viene lanciata una sql exception l'inserimento avviene in maniera parziale !!!
    Qualcuno può aiutarmi?
    Uso la libreria mysql-connector-java-3.1.13 e tabelle innodb. Devo fare qualche altra cosa per usare le transazioni?
    Ecco il mio metodo, vi prego aiutatemi,non so più cosa fare....
    codice:
    public String executeTransaction() throws java.sql.SQLException {
    		java.sql.Connection conn = null;
    		javax.sql.DataSource dataSource = Singleton.getInstance()
    				.getDataSource();
    		conn = dataSource.getConnection();
    
    		Experiment exp = (Experiment) ViewUtils.eval("#{experiment}");
    
    		List results = new ArrayList();
    		ResultSet rs = null;
    		Statement stmt = null;
    		boolean allgood = false;
    		if (conn != null) {
    
    			conn.setAutoCommit(false);
    			//you can change Transaction Isolation level 
    
    			//conn.setTransactionIsolation(java.sql.Connection.TRANSACTION_READ_COMMITT_ED); 
    			conn.setSavepoint();//set rollback point 
    
    			try {
    				for (int i = 0; i < exp.getExperiments().size(); i++) {
    
    					((java.sql.PreparedStatement) exp.getExperiments().get(i))
    							.executeUpdate();
    					if (i == (exp.getExperiments().size() - 1)) {
    						conn.commit();
    					}
    
    				}
    			} catch (Exception e) {
    				conn.rollback();
    				e.printStackTrace();
    			}
    
    		} else {
    			System.out.println("connessione non disponibile");
    		}
    
    		return "submit";
    	}
    Grazie mille

  2. #2
    Utente di HTML.it L'avatar di floyd
    Registrato dal
    Apr 2001
    Messaggi
    3,837
    dopo aver creato la connessione devi dirgli che è in una transaz.
    conn.setAutoCommit(false);

  3. #3
    Utente di HTML.it
    Registrato dal
    Feb 2006
    Messaggi
    258
    forse ti sarà sfuggito ma l'ho fatto!!!
    codice:
    conn = dataSource.getConnection();
    
    		Experiment exp = (Experiment) ViewUtils.eval("#{experiment}");
    
    		List results = new ArrayList();
    		ResultSet rs = null;
    		Statement stmt = null;
    		boolean allgood = false;
    		if (conn != null) {
    
    			conn.setAutoCommit(false);
    anche mettendolo qualche riga prima non cambia niente...
    piuttosto ora ho provato a fare
    System.out.println(int x=conn.TRANSACTION_NONE);

    e mi esce fuori 0....che vuol dire?
    Che non supporta le transazioni o cosa?
    Cosa posso fare?
    Grazie mille

  4. #4
    Utente di HTML.it L'avatar di floyd
    Registrato dal
    Apr 2001
    Messaggi
    3,837
    mi era sfuggito
    le tabelle usano il myisam engine?
    per avere le transazioni devono essere innodb

  5. #5
    Utente di HTML.it
    Registrato dal
    Feb 2006
    Messaggi
    258
    Le tabelle sono Innodb.
    Ho cercato di capire se le transazioni fossero supportate
    codice:
     
    Connection conn = dataSource.getConnection(); 
    System.out.println(conn.getMetaData().supportsTransactions()); 
    conn.setAutoCommit(false); 
    System.out.println("We are in autocommit 
    mode?"+conn.getAutoCommit());
    alla prima mi viene true, alla seconda false, che dovrebbe significare
    transazioni supportate e modalità di autocommit disabilitata,giusto?
    Fatta questa premessa,qual è il problema?


    Il problema è che quando scorro l'arraylist di statement e li eseguo
    si ha il commit per ogni statement,per cui una sql exception mi fa
    avere inserimenti parziali.
    Io vorrei che dopo le esecuzioni degli statements fossi io,sulla base
    di una condizione logica a fare il commit o il rollback!!!
    Quale può essere il problema?Manco qualcosa nel codice?
    Ecco il mio semplice metodo,esegue tutti gli statements nella list,se
    vanno bene memorizza in un'altra lista un booleano vero,se vanno male
    un falso.
    Alla fine scorre l'altra lista,appena trova un booleano falso
    rollback(o per lo meno dovrebbe),se non ne trova fa il commit. Perchè
    non riesco a fare ciò?
    Grazie mille

  6. #6
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,328

    Moderazione

    Il linguaggio va specificato anche nel titolo. Soprattutto se riguarda una tecnologia specifica, come in questo caso.

    Questo l'ho modificato io.


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.