programing

PSQL 예외: 현재 트랜잭션이 중단되었습니다. 트랜잭션 블록이 끝날 때까지 명령이 무시됩니다.

bestprogram 2023. 5. 12. 22:49

PSQL 예외: 현재 트랜잭션이 중단되었습니다. 트랜잭션 블록이 끝날 때까지 명령이 무시됩니다.

JBoss 7.1.1 Final의 server.log 파일에 다음(잘린) 스택 추적이 있습니다.

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

at org.postgresql.core.v3.QueryExecutorImpl.receiveErrorResponse(QueryExecutorImpl.java:2102)
at org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:1835)
at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:257)
at org.postgresql.jdbc2.AbstractJdbc2Statement.execute(AbstractJdbc2Statement.java:512)
at org.postgresql.jdbc2.AbstractJdbc2Statement.executeWithFlags(AbstractJdbc2Statement.java:374)
at org.postgresql.jdbc2.AbstractJdbc2Statement.executeUpdate(AbstractJdbc2Statement.java:302)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) [rt.jar:1.6.0_23]
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) [rt.jar:1.6.0_23]
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) [rt.jar:1.6.0_23]
at java.lang.reflect.Method.invoke(Method.java:597) [rt.jar:1.6.0_23]
at org.postgresql.ds.jdbc23.AbstractJdbc23PooledConnection$StatementHandler.invoke(AbstractJdbc23PooledConnection.java:455)
at $Proxy49.executeUpdate(Unknown Source)   at org.jboss.jca.adapters.jdbc.WrappedStatement.executeUpdate(WrappedStatement.java:371)
at org.infinispan.loaders.jdbc.TableManipulation.executeUpdateSql(TableManipulation.java:154) [infinispan-cachestore-jdbc-5.1.2.FINAL.jar:5.1.2.FINAL]
... 154 more

Postgres 로그 파일을 검사하면 다음 문이 나타납니다.

STATEMENT:  SELECT count(*) FROM ISPN_MIXED_BINARY_TABLE_configCache
ERROR:  current transaction is aborted, commands ignored until end of transaction block
STATEMENT:  CREATE TABLE ISPN_MIXED_BINARY_TABLE_configCache(ID_COLUMN VARCHAR(255) NOT NULL, DATA_COLUMN BYTEA, TIMESTAMP_COLUMN BIGINT, PRIMARY KEY (ID_COLUMN))
ERROR:  relation "ispn_mixed_binary_table_configcache" does not exist at character 22

JBoss 7.1.1 Final 5.1.2와 함께 제공된 Infinispan을 사용하고 있습니다.최종.

그래서 저는 이렇게 생각합니다.

  • 은 Infinispan 실도다니합시를 하려고 합니다.SELECT count(*)...기이있확위진술한기인에 .ISPN_MIXED_BINARY_TABLE_configCache;
  • Postgres는 어떤 이유에서인지 이 진술을 좋아하지 않습니다.
  • Infinispan은 이를 무시하고 앞으로 나아갑니다.CREATE TABLE진술.
  • 동일한이라고 barfs이며, 이 트랜잭션은 첫 Infinispan 롤백동실여일트고생전라각히때하기에문이이랜잭션한패하한는 Postgres barfs에서 . 이 트랜잭션은 첫 번째부터 축에 들어갑니다.SELECT count(*)...진술.

이 오류의 의미와 해결 방법은 무엇입니까?

Java와 Postgre를 사용하여 이 오류가 발생했습니다.테이블에 삽입하는 SQL입니다.이 오류를 재현하는 방법을 설명하겠습니다.

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

요약:.

이 오류가 발생하는 이유는 트랜잭션을 입력했는데 SQL 쿼리 중 하나가 실패했는데 해당 오류를 게걸스럽게 처리하고 무시했기 때문입니다.하지만 그것만으로는 충분하지 않았습니다. 그리고 당신은 동일한 연결을 사용했고, 다른 쿼리를 실행하기 위해 동일한 트랜잭션을 사용했습니다.중단된 트랜잭션을 사용하여 추가 작업을 수행하기 때문에 두 번째로 올바르게 형성된 쿼리에 예외가 발생합니다.포스트그레SQL에서는 기본적으로 이 작업을 수행할 수 없습니다.

사용 중: 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".

나의 포스트그SQL 드라이버: postgresql-9.2-1000.jdbc4.jar

Java 버전 사용: Java 1.7

다음은 예외를 설명하는 테이블 만들기 문입니다.

CREATE TABLE moobar
(
    myval   INT
);

Java 프로그램으로 인해 다음 오류가 발생합니다.

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

}

위의 코드는 다음과 같은 출력을 생성합니다.

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

해결 방법:

몇 가지 옵션이 있습니다.

  1. 거래하지 마세요.을 합니다.connection.setAutoCommit(false);connection.setAutoCommit(true);실패한 SQL이 실패한 SQL 문으로 무시되기 때문에 작동합니다.해도 좋고 Postgre//Postgre/Postgre/Postgre/Postgre/Postgre/Postgre/Postgre/Postgre/Postgre/Postgre/Postgre/Postgre/Postgre/SSQL로는 막을 수 없습니다.

  2. 트랜잭션 상태를 유지하지만 첫 번째 SQL이 실패했음을 감지하면 트랜잭션을 롤백/다시 시작하거나 커밋/다시 시작합니다.그런 다음 해당 데이터베이스 연결에서 원하는 만큼 SQL 쿼리를 계속 실패할 수 있습니다.

  3. SQL 문이 실패할 때 던져지는 예외를 감지하거나 무시하지 마십시오.그러면 프로그램이 잘못된 형식의 쿼리에서 중지됩니다.

  4. 대신 Oracle을 사용하면 트랜잭션 내 연결에 대한 쿼리를 실패하고 해당 연결을 계속 사용할 때 Oracle이 예외를 발생시키지 않습니다.

포스그레를 방어하기 위해이런 식으로 일을 처리하기로 한 SQL의 결정은...오라클은 중간에 당신을 부드럽게 만들고 당신이 멍청한 일을 하고 그것을 간과하도록 했습니다.

원인이 된 문 앞의 출력을 확인합니다.current transaction is aborted이는 일반적으로 데이터베이스가 코드가 무시한 예외를 던졌고 이제 다음 쿼리가 일부 데이터를 반환할 것으로 예상된다는 것을 의미합니다.

이제 정상이라고 생각하는 애플리케이션과 데이터베이스 간에 상태 불일치가 발생하여 처음부터 트랜잭션을 롤백하고 다시 시작해야 합니다.

이러한 경우 모든 예외를 파악하고 트랜잭션을 롤백해야 합니다.

여기 비슷한 문제가 있습니다.

좋은 은 제해생가좋은은결책을 사용하는 합니다.java.sql.Savepoint.

에 쿼리를 실행할 수 .throw SQLException은 다음과 같습니다.Connection.setSavepoint()예외가 발생하면 전체 트랜잭션이 아닌 이 저장 지점으로 롤백합니다.

코드 예제:

Connection conn = null;
Savepoint savepoint = null;
try {
    conn = getConnection();
    savepoint = conn.setSavepoint();
    //execute some query
} catch(SQLException e) {
    if(conn != null && savepoint != null) {
        conn.rollback(savepoint);
    }
} finally {
   if(conn != null) {
      try {
          conn.close();
      } catch(SQLException e) {}

   }
}

JDBC Driver에 이 몇 수행되었습니다.
https://github.com/pgjdbc/pgjdbc/pull/477 을 참조하십시오.

이제 설정을 통해 가능합니다.

자동 저장=항상
in the connection (see https://jdbc.postgresql.org/documentation/head/connect.html) to avoid the 'current transaction is aborted' syndroma.
Overhead due to handling a savepoint around the statement execution is kept very low (see link above for details).

사용해 보세요.COMMIT;

저는 그것을 pgadmin4에서 실행합니다.도움이 될 수 있습니다.이전 명령이 너무 일찍 중지된 것과 관련이 있습니다.

Ruby on Rails PG에서 마이그레이션을 생성하고 DB를 마이그레이션했지만 개발 서버를 다시 시작하지 못했습니다.서버를 다시 시작했는데 작동했습니다.

이 오류의 원인은 잘못된 작업이 현재 데이터베이스 작업으로 이어지기 전에 다른 데이터베이스가 있기 때문입니다. 구글 번역을 사용하여 중국어를 영어로 번역합니다.

롤백해야 합니다.JDBC Postgres 드라이버가 상당히 불량합니다.그러나 트랜잭션을 유지하고 오류를 롤백하려면 저장 지점을 사용할 수 있습니다.

try {
_stmt = connection.createStatement();
_savePoint = connection.setSavepoint("sp01");
_result = _stmt.executeUpdate(sentence) > 0;
} catch (Exception e){
 if (_savePoint!=null){
 connection.rollback(_savePoint);
}
}

여기서 자세히 알아보기:

http://www.postgresql.org/docs/8.1/static/sql-savepoint.html

이 문제는 Infinispan 5.1.5에서 수정되었습니다.CR1: ISPN-2023

저도 같은 문제가 있었지만 데이터베이스에 같은 이름의 테이블이 있다는 것을 깨달았습니다.삭제 후 파일을 가져올 수 있었습니다.

이것은 Postgre의 매우 이상한 행동입니다.SQL, Postgre와 "일치하지 않음"사용자가 모든 것을 명시적으로 만들도록 강제하는 SQL 철학 - 예외가 발견되고 명시적으로 무시됨.그래서 이 방어도 성립되지 않습니다.이 경우 Oracle은 훨씬 더 사용자 친화적으로 작동하며 (저로서는) 올바르게 작동합니다. 개발자에게 선택의 여지가 있습니다.

볼륨의 디스크 공간이 부족한 경우 이 문제가 발생할 수 있습니다.

문제는 드라이버가 설치되지 않았다는 것입니다.드라이버를 다운로드하여 ~/Library/Tableau/Driver(mac) 폴더에 붙여넣었더니 작동했습니다.

커밋되지 않은 트랜잭션이 하나 있어서 DB 응용프로그램 도구에서 이 오류가 발생했습니다.선택 쿼리를 실행하려고 합니다. 그래서 이 오류가 발생했습니다.실행 중인 문제를 해결할 수 있습니다.

commit;

또는

rollback;

저도 같은 오류가 발생했을 뿐입니다.로컬 Postgre에서 log_statementlog_min_error_statement를 활성화하여 근본 원인을 파악할 수 있었습니다.SQL.

참조했습니다.

저는 Postgres와 함께 JDBI를 사용하고 있으며 동일한 문제에 직면했습니다. 즉, 이전 거래 명세서의 일부 제약 조건을 위반한 후 후속 진술이 실패할 것입니다(그러나 잠시 기다린 후, 예를 들어 20-30초 후에 문제가 사라집니다).

몇 가지 조사를 한 결과, JDBI에서 수동으로 트랜잭션을 수행하는 것이 문제라는 것을 알게 되었습니다.나는 내 진술을 BEGIN으로 둘러쌌습니다; ...커밋; 그리고 그것이 범인임이 밝혀졌습니다!

JDBI v2에서 @Transaction 주석을 추가하면 @SqlQuery 또는 @SqlUpdate 내의 문이 트랜잭션으로 실행되며 위에서 언급한 문제는 더 이상 발생하지 않습니다!

제 경우 파일이 손상되어 이 오류가 발생했습니다.파일 기록을 반복하는 동안 동일한 오류가 발생했습니다.

아마도 미래에는 누구에게나 도움이 될 것입니다.그것이 이 답변을 게시하는 유일한 이유입니다.

나는 봄을 사용합니다.@Transactional주석, 예외가 발생했습니다. 예외가 있을 경우 3번 다시 시도합니다.

posgresql의 경우 예외가 발생하면 동일한 연결을 사용하여 더 이상 커밋할 수 없습니다.먼저 롤백해야 합니다.

제경에는, 는저우를 합니다.DatasourceUtils 전화를 걸다connection.rollback() 다시합니다.그리고 다시 시도할 방법을 모집합니다.

dbeaver 또는 pgAdmin과 같은 SQL 클라이언트를 사용하는 경우 연결 끊기를 클릭하고 스퀘마 또는 데이터베이스에서 다시 연결을 클릭합니다.

분리 수준을 반복 가능한 읽기에서 읽기 전용으로 변경합니다.

스프링 부트 jpa로 작업하다가 @EnableTransactionManagement를 구현하여 수정했습니다.

첨부된 파일이 도움이 될 수 있습니다.

스프링 부트 jpa로 작업하다가 @EnableTransactionManagement를 구현하여 수정했습니다.

첨부된 파일이 여기에 이미지 설명 입력도움이 될 수 있습니다.

언급URL : https://stackoverflow.com/questions/10399727/psqlexception-current-transaction-is-aborted-commands-ignored-until-end-of-tra