Oracle
 sql >> Teknologi Basis Data >  >> RDS >> Oracle

Bisakah saya mengubah properti AutoCommit dari koneksi JDBC beberapa kali?

Pembaruan terakhir :ya, Anda dapat mengubah autoCommit beberapa kali, Anda juga dapat mengatasinya menggunakan perintah commit/rollback dalam pernyataan seperti yang Anda temukan. Saran saya adalah tetap menggunakan autoCommit yang disetel ke false dan selalu gunakan transaksi di mana Anda membutuhkannya.

Saya juga menggunakan Postgres dan Oracle dan saya selalu menggunakan autocommit =false, karena saya tidak dapat mengelola transaksi dengan autocommit =true

Anda dapat mengubah komit otomatis saat Anda menguji tetapi saya mendorong Anda untuk mengelola transaksi secara eksplisit meskipun itu adalah satu pernyataan.

Jika Anda dapat menggunakan kerangka kerja seperti Spring (atau Guice) ada manajemen transaksi yang dilakukan melalui AOP dan Anda tidak perlu repot dengan instruksi commit dan rollback.

Di Oracle, waktu commit tidak bergantung pada jumlah data yang di-commit dan commit dengan frekuensi yang lebih tinggi (berkenaan dengan persyaratan fungsional) juga dapat merusak kinerja.

Perbarui :Dari komentar Anda, Anda menyatakan bahwa Postgres menghormati batasan transaksi dalam komit otomatis; Saya tidak dapat mereproduksi perilaku di sini adalah kasus uji sederhana:

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

    }

}

program gagal melakukan rollback dengan Pengecualian:

Jadi tidak mungkin untuk mengelola transaksi ketika autoCommit benar; apakah Anda menemukan sesuatu yang berbeda?

Pembaruan II :Bahkan dengan kode ini yang menurut saya mencerminkan data dalam komentar Anda, saya mendapatkan Pengecualian:

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. Contoh Pernyataan Oracle FOR LOOP SELECT

  2. SQL bukan bulan yang valid

  3. Perbarui dengan permintaan Gabung di Oracle

  4. Oracle, PDO_OCI vs OCI8

  5. Jumlah baris di Oracle SQL Select?