Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

Posso alterar a propriedade AutoCommit de uma conexão JDBC várias vezes


Atualização final :sim, você pode alterar o autoCommit várias vezes, também pode contorná-lo usando o comando commit/rollback em uma instrução conforme descobriu. Meu conselho é manter o autoCommit definido como false e sempre usar transações onde você precisar delas.

Também estou usando Postgres e Oracle e estou sempre usando autocommit =false, pois não consigo gerenciar transações com autocommit =true

Você pode alterar o autocommit conforme testou, mas recomendo que você gerencie as transações explicitamente, mesmo que seja uma única instrução.

Se você pode usar um framework como Spring (ou Guice), há gerenciamento de transações feito via AOP e você não precisa se preocupar com instruções de commit e rollback.

No Oracle, o tempo de confirmação não depende da quantidade de dados confirmados e a confirmação com maior frequência (no que diz respeito aos requisitos funcionais) também pode prejudicar o desempenho.

Atualizar :A partir do seu comentário, você afirma que o Postgres respeita os limites da transação no autocommit; Não consigo reproduzir o comportamento aqui é um caso de teste simples:
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();

    }

}

o programa falha ao reverter com uma exceção:

Portanto, não é possível gerenciar transações quando autoCommit for true; achou algo diferente?

Atualização II :Mesmo com esse código que acho que reflete os dados no seu comentário recebi a Exception:
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();

    }

}