sql >> Databasteknik >  >> RDS >> Oracle

Kan jag ändra AutoCommit-egenskapen för en JDBC-anslutning flera gånger

Slutlig uppdatering :ja du kan ändra autoCommit flera gånger, du kan också lösa det med kommandot commit/rollback i en sats som du upptäckte. Mitt råd är att hålla fast vid autoCommit inställt på falskt och alltid använda transaktioner där du behöver dem.

Jag använder också Postgres och Oracle och jag använder alltid autocommit =false, eftersom jag inte kan hantera transaktioner med autocommit =true

Du kan ändra autocommit som du testade, men jag uppmuntrar dig att hantera transaktioner explicit även om det är ett enda uttalande.

Om du kan använda ett ramverk som Spring (eller Guice) finns transaktionshantering som görs via AOP och du behöver inte besvära dig med instruktioner för commit och rollback.

I Oracle beror inte commit-tiden på mängden data som begåtts och commit med en högre frekvens (med hänsyn till funktionella krav) kan också skada prestandan.

Uppdatera :Från din kommentar anger du att Postgres respekterar transaktionsgränser i autocommit; Jag kan inte återskapa beteendet här är ett enkelt 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();

    }

}

programmet kan inte återställas med ett undantag:

Så det är inte möjligt att hantera transaktioner när autoCommit är sant; hittade du något annat?

Uppdatering II :Även med den här koden som jag tror att den återspeglar data i din kommentar fick jag undantaget:

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

    }

}



  1. Letar efter en rätt EAV-struktur baserad på jsonb

  2. Hibernate, C3P0, Mysql -- Broken Pipe

  3. Varför returnerar IS NOT NULL NULL-värden för en Varchar(max) i SQL Server?

  4. Dela upp poster i två kolumner