Oracle
 sql >> база данни >  >> RDS >> Oracle

Мога ли да променя свойството AutoCommit на JDBC връзка няколко пъти

Окончателна актуализация :да, можете да промените autoCommit няколко пъти, можете също да го заобиколите, като използвате командата commit/rollback в изявление, както открихте. Моят съвет е да се придържате към autoCommit, зададен на false, и винаги да използвате транзакции, където имате нужда от тях.

Също така използвам Postgres и Oracle и винаги използвам autocommit =false, тъй като не мога да управлявам транзакции с autocommit =true

Можете да промените автоматичния ангажимент, докато тествахте, но ви насърчавам да управлявате транзакциите изрично, дори ако това е едно изявление.

Ако можете да използвате рамка като Spring (или Guice), има управление на транзакции, направено чрез AOP и не е нужно да се занимавате с инструкции за извършване и връщане назад.

В Oracle времето за ангажиране не зависи от количеството ангажирани данни и ангажирането с по-висока честота (по отношение на функционалните изисквания) също може да навреди на производителността.

Актуализация :От вашия коментар вие заявявате, че Postgres спазва границите на транзакциите в autocommit; Не мога да възпроизведа поведението тук е прост тестов случай:

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

    }

}

програмата не успява да се върне назад с изключение:

Така че не е възможно да се управляват транзакции, когато autoCommit е true; намерихте ли нещо различно?

Актуализация II :Дори с този код, който според мен отразява данните във вашия коментар, получих изключение:

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. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. ORA-00927:липсва знак за равенство

  2. Как да конфигурирате c3p0 в хибернация за автоматично опресняване на остарели DB връзки

  3. Вземете плик, т.е. припокриващи се времеви интервали

  4. Solve не може да изпълни DML операция вътре в заявка

  5. Дали xmlparserv2 от com.oracle.jdbc:ojdbc8 (v12.2.0.1) изведнъж е повреден?