अंतिम अपडेट :हाँ आप ऑटोकॉमिट को कई बार बदल सकते हैं, जैसा कि आपने खोजा था, आप एक स्टेटमेंट में कमिट/रोलबैक कमांड का उपयोग करके इसे वर्कअराउंड भी कर सकते हैं। मेरी सलाह है कि ऑटोकॉमिट सेट के साथ झूठ बोलना और हमेशा लेनदेन का उपयोग करना जहां आपको उनकी आवश्यकता हो।
मैं Postgres और Oracle का भी उपयोग कर रहा हूं और मैं हमेशा autocommit =false का उपयोग कर रहा हूं, क्योंकि मैं autocommit =true
के साथ लेनदेन का प्रबंधन नहीं कर सकताजैसा कि आपने परीक्षण किया है, आप ऑटोकॉमिट बदल सकते हैं लेकिन मैं आपको लेनदेन को स्पष्ट रूप से प्रबंधित करने के लिए प्रोत्साहित करता हूं, भले ही यह एक ही कथन हो।
यदि आप स्प्रिंग (या गुइस) जैसे ढांचे का उपयोग कर सकते हैं तो एओपी के माध्यम से लेनदेन प्रबंधन किया जाता है और आपको प्रतिबद्ध और रोलबैक निर्देशों से परेशान होने की आवश्यकता नहीं है।
ओरेकल में प्रतिबद्ध समय प्रतिबद्ध डेटा की मात्रा पर निर्भर नहीं करता है और उच्च आवृत्ति (कार्यात्मक आवश्यकताओं के संबंध में) के साथ प्रदर्शन को भी नुकसान पहुंचा सकता है।
अपडेट करें :आपकी टिप्पणी से आप कहते हैं कि 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();
}
}
प्रोग्राम एक अपवाद के साथ रोलबैक करने में विफल रहता है:
इसलिए ऑटोकॉमिट सत्य होने पर लेनदेन का प्रबंधन करना संभव नहीं है; क्या आपको कुछ अलग लगा?
अपडेट 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();
}
}