Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Kann ich die AutoCommit-Eigenschaft einer JDBC-Verbindung mehrmals ändern

Letztes Update :Ja, Sie können autoCommit mehrmals ändern, Sie können es auch umgehen, indem Sie den Commit/Rollback-Befehl in einer Anweisung verwenden, wie Sie entdeckt haben. Mein Rat ist, bei autoCommit auf false zu bleiben und Transaktionen immer dort zu verwenden, wo Sie sie brauchen.

Ich verwende auch Postgres und Oracle und verwende immer autocommit =false, da ich Transaktionen mit autocommit =true nicht verwalten kann

Sie können Autocommit während des Tests ändern, aber ich ermutige Sie, Transaktionen explizit zu verwalten, selbst wenn es sich um eine einzelne Anweisung handelt.

Wenn Sie ein Framework wie Spring (oder Guice) verwenden können, erfolgt die Transaktionsverwaltung über AOP und Sie müssen sich nicht mit Commit- und Rollback-Anweisungen herumschlagen.

In Oracle hängt die Commit-Zeit nicht von der Menge der festgeschriebenen Daten ab, und ein Commit mit einer höheren Frequenz (in Bezug auf funktionale Anforderungen) kann auch die Leistung beeinträchtigen.

Aktualisieren :In Ihrem Kommentar geben Sie an, dass Postgres Transaktionsgrenzen beim Autocommit respektiert. Ich kann das Verhalten hier nicht reproduzieren, ist ein einfacher Testfall:

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

    }

}

Das Programm schlägt mit einer Ausnahme beim Rollback fehl:

Es ist also nicht möglich, Transaktionen zu verwalten, wenn autoCommit wahr ist; hast du etwas anderes gefunden?

Aktualisierung II :Selbst mit diesem Code, der meiner Meinung nach die Daten in Ihrem Kommentar widerspiegelt, habe ich die Ausnahme:

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

    }

}