Окончателна актуализация :да, можете да промените 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();
}
}