Oracle
 sql >> Base de données >  >> RDS >> Oracle

Puis-je modifier plusieurs fois la propriété AutoCommit d'une connexion JDBC

Mise à jour finale :oui, vous pouvez modifier autoCommit plusieurs fois, vous pouvez également le contourner en utilisant la commande commit/rollback dans une instruction que vous avez découverte. Mon conseil est de s'en tenir à autoCommit défini sur false et de toujours utiliser les transactions là où vous en avez besoin.

J'utilise également Postgres et Oracle et j'utilise toujours autocommit =false, car je ne peux pas gérer les transactions avec autocommit =true

Vous pouvez modifier l'autocommit lors de vos tests, mais je vous encourage à gérer les transactions de manière explicite, même s'il s'agit d'une seule instruction.

Si vous pouvez utiliser un framework comme Spring (ou Guice), la gestion des transactions est effectuée via AOP et vous n'avez pas besoin de vous soucier des instructions de validation et de restauration.

Dans Oracle, le temps de validation ne dépend pas de la quantité de données validées et la validation avec une fréquence plus élevée (par rapport aux exigences fonctionnelles) peut également nuire aux performances.

Mettre à jour :D'après votre commentaire, vous déclarez que Postgres respecte les limites de transaction dans l'autocommit ; Je n'arrive pas à reproduire le comportement voici un cas de test simple :

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();

    }

}

le programme ne parvient pas à revenir en arrière avec une exception :

Il n'est donc pas possible de gérer les transactions lorsque autoCommit vaut true; avez-vous trouvé quelque chose de différent ?

Mise à jour II :Même avec ce code qui, je pense, reflète les données de votre commentaire, j'ai eu l'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();

    }

}