# JDBC Transaktion autocommit



## Tallan (4. Feb 2010)

Hallo zusammen,

ich habe folgendes beobachtet und bin mir nicht sicher ob das so sein sollte...


ich hab eine connectionpool der anbindungen an die DB zur verfügung stellt.
wenn ich nun bei einer vorhandenen verbindung autoconnect ausschalte und danach eine Select anweisung ausführe kommt sofern ich danach einen commit auf dieser connection mache
die fehlermeldung das ein commit nicht möglich ist solange autocommit true ist.

Beispiel : 


```
//Connection holen
    	Connection con = ConnectionPool.getConnection();
        con.setAutoCommit(false);
        System.out.println("Autocommit : " + con.getAutoCommit()); // ergebnis ist false
        
        ResultSet rsUserName = executeQuery(con, "Select ......");
        
        System.out.println("Autocommit : " + con.getAutoCommit()); // ergebnis ist false
        //commiten
	    con.commit();  // HIER TRITT DER FEHLER AUF 
	    //zurücksetzen
	    con.setAutoCommit(true);
	    //freigeben
		ConnectionPool.freeConnection(con);
```

Mir ist klar das es sich dabei nur um eine lesende Anfrage handelt und keine Daten geschrieben werde womit die Transaktion nicht nötig ist aber warum diese Fehlermeldung 

java.sql.SQLExeption : Can't call commit when autocommit=true
...


----------



## maki (4. Feb 2010)

Wie werden denn die Connections im Pool erzeugt?
Unterstützt die DB auch Transaktionen? Ist nicht immer der Fall, siehe zB. MySQL MyISAM Tabellen...


----------



## Tallan (5. Feb 2010)

Die Datenbank unterstützt transkationen, das habe ich auch getestet
Engine ist InnoDB

Anbei wie die Connection erstellt wird 


```
private static Connection createConnection() {
		Connection conn = null;
		try {

			try {
				Class.forName("com.mysql.jdbc.Driver").newInstance();
			} catch (InstantiationException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			} catch (IllegalAccessException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			} catch (ClassNotFoundException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			conn = DriverManager.getConnection("jdbc:mysql://<<IP>>/<<Datenbank>>","<<Login>>","<<PW>>");
	
		} catch (SQLException ex) {
			ex.printStackTrace();
		}
		return conn;
```


----------



## maki (5. Feb 2010)

Versuche mal bei der Erstelluing bereits festzulegen das autocommit off ist, ansonsten kannst du ja prüfen ob autocommit an oder aus ist, die JdbcConnection sollte doch eine Methode dafür haben.


----------



## Tallan (5. Feb 2010)

Hab ich schon siehe erster Post
 System.out.println("Autocommit : " + con.getAutoCommit());

die Angebe gibt false zurück und bei einem con.commit kommt die Fehlermeldung das das nicht geht wenn autocommit = true ist


----------



## maki (5. Feb 2010)

Naja, du brauchst auf jedenfall kein commit bei einer Select Query, ist das "Problem" denn wirklich eines?


----------



## Tallan (5. Feb 2010)

jein ich brauch es effektiv nicht wüsste aber schon gerne warum es auftritt da es mich doch etwas verunsichert


----------



## Manuela (17. Feb 2010)

Hallo besteht dein Problem immer noch?


```
//Connection holen
        Connection con = ConnectionPool.getConnection();
        con.setAutoCommit(false);
        System.out.println("Autocommit : " + con.getAutoCommit()); // ergebnis ist false
        
        ResultSet rsUserName = executeQuery(con, "Select ......");
        
        System.out.println("Autocommit : " + con.getAutoCommit()); // ergebnis ist false
        //commiten
        con.commit();  // HIER TRITT DER FEHLER AUF 
        //zurücksetzen
        con.setAutoCommit(true);
        //freigeben
        ConnectionPool.freeConnection(con);
```
Ich habe das so gemacht bei mir geht das

```
c = con.getConnection();
        c = Connector.getInstance().getConnection();
         c.setAutoCommit(false);
        try {
          String sql="...";
          java.sql.CallableStatement call = c.prepareCall(sql);
     

  ...

            call.close();

  

               c.commit();

        } catch (SQLException ex) {
                  c.rollback();
         
        }
```
vielleicht hilft Dir das.
Gruß Manuela


----------

