Oracle
 sql >> Database >  >> RDS >> Oracle

Posso modificare più volte la proprietà AutoCommit di una connessione JDBC

Aggiornamento finale :sì, puoi modificare autoCommit più volte, puoi anche aggirarlo usando il comando commit/rollback in un'istruzione come hai scoperto. Il mio consiglio è di restare con autoCommit impostato su false e utilizzare sempre le transazioni dove ne hai bisogno.

Sto usando anche Postgres e Oracle e utilizzo sempre autocommit =false, poiché non riesco a gestire le transazioni con autocommit =true

Puoi modificare l'autocommit durante il test, ma ti incoraggio a gestire le transazioni in modo esplicito anche se si tratta di una singola istruzione.

Se puoi utilizzare un framework come Spring (o Guice), c'è una gestione delle transazioni effettuata tramite AOP e non devi preoccuparti delle istruzioni di commit e rollback.

In Oracle il tempo di commit non dipende dalla quantità di dati impegnati e anche impegnarsi con una frequenza maggiore (rispetto ai requisiti funzionali) può influire negativamente sulle prestazioni.

Aggiorna :Dal tuo commento dichiari che Postgres rispetta i limiti delle transazioni in autocommit; Non riesco a riprodurre il comportamento qui è un semplice test case:

package test;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

public class TestPostgresAutocommit {

    public static void main(String[] args) throws Exception {
        Connection connection= DriverManager.getConnection("jdbc:postgresql://pgdev/dbxxx","xxx","xxx");
        connection.setAutoCommit(true);
        Connection connection2= DriverManager.getConnection("jdbc:postgresql://pgdev/dbxxx","xxx","xxx");
        connection2.setAutoCommit(true);        
        Statement statement=connection.createStatement();
        for (int i=0; i<10; i++) {
            statement.execute("insert into test_gc(col1,col2) values ("+ i + "," + "'" + i + "')");
        }
        statement.close();
        countElements(connection2);
        statement=connection.createStatement();
        statement.execute("delete from test_gc");
        statement.close();
        statement=connection.createStatement();
        statement.execute("begin");
        statement.close();
        statement=connection.createStatement();
        for (int i=0; i<10; i++) {
            statement.execute("insert into test_gc(col1,col2) values ("+ i + "," + "'" + i + "')");
        }
        connection.rollback();
        countElements(connection2);

    }

    private static void countElements(Connection connection2) throws Exception {
        Statement statement2=connection2.createStatement();
        ResultSet rs=statement2.executeQuery("select count(*) from test_gc");
        rs.next();
        System.out.println("row num in table=" + rs.getInt(1)); 
        rs.close();
        statement2.close();

    }

}

il programma non riesce a eseguire il rollback con un'eccezione:

Quindi non è possibile gestire le transazioni quando autoCommit è true; hai trovato qualcosa di diverso?

Aggiornamento II :Anche con questo codice che penso rifletta i dati nel tuo commento ho ottenuto l'eccezione:

package test;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

public class TestPostgresAutocommit {

    public static void main(String[] args) throws Exception {
        //System.out.println("start");
        Connection connection= DriverManager.getConnection("jdbc:postgresql://pgdev/dbxxx","xxx","xxx");
        connection.setAutoCommit(true);
        Connection connection2= DriverManager.getConnection("jdbc:postgresql://pgdev/dbdxxx","xxx","xxx");
        connection2.setAutoCommit(true);        
        Statement statement=connection.createStatement();
        for (int i=0; i<10; i++) {
            statement.execute("insert into test_gc(col1,col2) values ("+ i + "," + "'" + i + "')");
        }
        statement.close();
        countElements(connection2);
        statement=connection.createStatement();
        statement.execute("delete from test_gc");
        statement.close();
        statement=connection.createStatement();
        statement.execute("begin");
        for (int i=0; i<10; i++) {
            statement.execute("insert into test_gc(col1,col2) values ("+ i + "," + "'" + i + "')");
        }
        connection.rollback();
        countElements(connection2);

    }

    private static void countElements(Connection connection2) throws Exception {
        Statement statement2=connection2.createStatement();
        ResultSet rs=statement2.executeQuery("select count(*) from test_gc");
        rs.next();
        System.out.println("row num in table=" + rs.getInt(1)); 
        rs.close();
        statement2.close();

    }

}