Laatste update :ja, je kunt autoCommit meerdere keren wijzigen, je kunt het ook omzeilen met de opdracht commit/rollback in een statement zoals je hebt ontdekt. Mijn advies is om autoCommit op false te houden en transacties altijd te gebruiken waar je ze nodig hebt.
Ik gebruik ook Postgres en Oracle en ik gebruik altijd autocommit =false, omdat ik geen transacties kan beheren met autocommit =true
U kunt automatisch vastleggen wijzigen zoals u hebt getest, maar ik raad u aan om transacties expliciet te beheren, zelfs als het een enkele verklaring is.
Als je een framework zoals Spring (of Guice) kunt gebruiken, is er transactiebeheer via AOP en hoef je je niet bezig te houden met commit- en rollback-instructies.
In Oracle hangt de commit-tijd niet af van de hoeveelheid data die is vastgelegd en een hogere frequentie (met betrekking tot functionele vereisten) kan ook de prestaties schaden.
Bijwerken :Uit uw opmerking geeft u aan dat Postgres transactiegrenzen in autocommit respecteert; Ik kan het gedrag hier niet reproduceren is een eenvoudige testcase:
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();
}
}
het programma kan niet terugdraaien met een uitzondering:
Het is dus niet mogelijk om transacties te beheren wanneer autoCommit waar is; heb je iets anders gevonden?
Update II :Zelfs met deze code waarvan ik denk dat deze de gegevens in uw opmerking weerspiegelt, kreeg ik de uitzondering:
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();
}
}