PostgreSQL
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> PostgreSQL

PSQLException:giao dịch hiện tại bị hủy bỏ, các lệnh bị bỏ qua cho đến khi kết thúc khối giao dịch

Tôi gặp lỗi này khi sử dụng Java và PostgreSQL khi thực hiện chèn trên bảng. Tôi sẽ minh họa cách bạn có thể tạo lại lỗi này:

org.postgresql.util.PSQLException: ERROR: 
current transaction is aborted, commands ignored until end of transaction block

Tóm tắt:

Lý do bạn nhận được lỗi này là vì bạn đã nhập một giao dịch và một trong các Truy vấn SQL của bạn không thành công, và bạn đã ghi lại lỗi đó và bỏ qua nó. Nhưng điều đó vẫn chưa đủ, THÌ bạn đã sử dụng cùng một kết nối đó, sử dụng cùng một GIAO DỊCH để chạy một truy vấn khác. Ngoại lệ được đưa vào truy vấn thứ hai, được định dạng chính xác bởi vì bạn đang sử dụng một giao dịch bị hỏng để thực hiện công việc bổ sung. PostgreSQL theo mặc định ngăn bạn làm việc này.

Tôi đang sử dụng: PostgreSQL 9.1.6 on x86_64-redhat-linux-gnu, compiled by gcc (GCC) 4.7.2 20120921 (Red Hat 4.7.2-2), 64-bit".

Trình điều khiển PostgreSQL của tôi là: postgresql-9.2-1000.jdbc4.jar

Sử dụng phiên bản Java: Java 1.7

Đây là câu lệnh tạo bảng để minh họa Ngoại lệ:

CREATE TABLE moobar
(
    myval   INT
);

Chương trình Java gây ra lỗi:

public void postgresql_insert()
{
    try  
    {
        connection.setAutoCommit(false);  //start of transaction.
        
        Statement statement = connection.createStatement();
        
        System.out.println("start doing statement.execute");
        
        statement.execute(
                "insert into moobar values(" +
                "'this SQL statement fails, and it " +
                "is gobbled up by the catch, okfine'); ");
     
        //The above line throws an exception because we try to cram
        //A string into an Int.  I Expect this, what happens is we gobble 
        //the Exception and ignore it like nothing is wrong.
        //But remember, we are in a TRANSACTION!  so keep reading.

        System.out.println("statement.execute done");
        
        statement.close();
        
    }
    catch (SQLException sqle)
    {
        System.out.println("keep on truckin, keep using " +
                "the last connection because what could go wrong?");
    }
    
    try{
        Statement statement = connection.createStatement();
        
        statement.executeQuery("select * from moobar");

        //This SQL is correctly formed, yet it throws the 
        //'transaction is aborted' SQL Exception, why?  Because:
        //A.  you were in a transaction.
        //B.  You ran a SQL statement that failed.
        //C.  You didn't do a rollback or commit on the affected connection.
        
    }
    catch (SQLException sqle)
    {
        sqle.printStackTrace();
    }   

}

Đoạn mã trên tạo ra kết quả này cho tôi:

start doing statement.execute

keep on truckin, keep using the last connection because what could go wrong?

org.postgresql.util.PSQLException: 
  ERROR: current transaction is aborted, commands ignored until 
  end of transaction block

Giải pháp thay thế:

Bạn có một số tùy chọn:

  1. Giải pháp đơn giản nhất:Đừng tham gia giao dịch. Đặt connection.setAutoCommit(false); thành connection.setAutoCommit(true); . Nó hoạt động vì khi đó SQL bị lỗi chỉ bị bỏ qua như một câu lệnh SQL bị lỗi. Bạn có thể không thực hiện được các câu lệnh SQL mà bạn muốn và PostgreSQL sẽ không ngăn cản bạn.

  2. Vẫn ở trong một giao dịch, nhưng khi bạn phát hiện ra rằng SQL đầu tiên bị lỗi, hãy khôi phục / bắt đầu lại hoặc cam kết / khởi động lại giao dịch. Sau đó, bạn có thể tiếp tục không thực hiện được nhiều truy vấn SQL trên kết nối cơ sở dữ liệu đó như bạn muốn.

  3. Đừng bắt và bỏ qua Ngoại lệ được ném ra khi một câu lệnh SQL bị lỗi. Sau đó, chương trình sẽ dừng trên truy vấn không đúng định dạng.

  4. Hãy tải Oracle để thay thế, Oracle không đưa ra một ngoại lệ khi bạn không thực hiện được một truy vấn trên một kết nối trong một giao dịch và tiếp tục sử dụng kết nối đó.

Để bảo vệ quyết định của PostgreSQL để làm mọi thứ theo cách này ... Oracle đã khiến bạn mềm mại ở giữa để bạn làm những việc ngu ngốc và bỏ qua nó.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. DROP FUNCTION mà không cần biết số lượng / loại tham số?

  2. Lấy tên của hàm hiện tại bên trong hàm bằng plpgsql

  3. Bật hỗ trợ PostgreSQL trong PHP trên Mac OS X

  4. Làm cách nào tôi có thể đảm bảo rằng một chế độ xem cụ thể hóa luôn được cập nhật?

  5. Mảng tổng hợp postgresql