문제

나는 응용 프로그램을 디버깅하려고 시도하고 (postgresql에 따라) 다음과 같은 오류가 발생했습니다. "현재 트랜잭션이 중단되고 명령은 무시됩니다."

내가 이해할 수있는 한 "거래"는 기본 데이터베이스 연결과 관련된 개념 일뿐입니다.

연결에 자동 커밋 "False"가있는 경우 실패하지 않는 한 동일한 문서를 통해 쿼리를 실행할 수 있습니다. 이 경우 롤백해야합니다.

Auto Commit이 "True"인 경우 모든 쿼리가 원자가로 간주되는 한 중요하지 않습니다.

Auto Commit False를 사용하면 간단한 경우에도 Postgresql에 의해 앞서 언급 한 오류가 발생합니다.

select * from foo

어떤 sqlexception (들)이 유효하지 않은 "트랜잭션"이 유효하지 않은 것으로 간주되거나 다른 쿼리에 사용되지 않거나 사용되지 않아야합니까?

MACOS 10.5, JAVA 1.5.0_16, JDBC 드라이버 8.1-407.JDBC3와 PostgreSQL 8.3 사용

도움이 되었습니까?

해결책

이 오류는 트랜잭션에서 전송 된 쿼리 중 하나가 실패했음을 의미하므로 현재 트랜잭션이 끝날 때까지 나머지 쿼리는 무시됩니다 (자동으로 롤백이됩니다). PostgreSQL의 경우 트랜잭션이 실패했으며 한 가지 예외로 오류 후에는 어떤 경우에도 롤백됩니다. 적절한 조치를 취해야합니다

  1. 진술을 버리고 새로 시작하십시오.
  2. 사용 저장 포인트거래에서 S는 그 시점으로 돌아가서 다른 경로를 시도 할 수 있습니다. (이것은 예외입니다)

할 수 있게 하다 쿼리 로깅 어떤 쿼리가 실패한 지, 그 이유를 확인하십시오.

어쨌든 귀하의 질문에 대한 정확한 답변은 SQLEXCeption이 거래 종료 명령이 전송 될 때, 즉 커밋 또는 롤백 (또는 종료)이 발행 될 때 롤백이 발생 함을 의미해야한다는 것입니다. 이것이 작동하는 방식입니다. SavePoints를 사용하면 여전히 동일한 규칙에 묶여 있으면 저장 한 곳으로 돌아가서 다른 것을 시도 할 수 있습니다.

다른 팁

대부분의 다른 DBMS에서 공유하지 않는 PostgreSQL의 특징적인 동작 인 것 같습니다. 일반적으로 (PostGRESQL 이외의) 오류로 인해 하나의 작업이 실패 할 수 있으며 동일한 트랜잭션에서 성공할 대체 작업을 시도하여 오류를 보상 할 수 있습니다. 한 가지 예 : 병합 (삽입/업데이트) 작업을 고려하십시오. 새 레코드를 삽입하려고하지만 이미 존재한다는 것을 알면 기존 레코드를 대신 변경하는 업데이트 작업으로 전환 할 수 있습니다. 이것은 모든 주요 DBM에서 잘 작동합니다. PostgreSQL에서는 작동하지 않는다고 확신 할 수는 없지만 다른 곳에서 본 설명 과이 질문에서는 시도 된 삽입 시도가 트랜잭션의 추가 활동도 실패 할 수 있음을 의미한다고 제안합니다. 그것은 가장 드라코 니안이고 최악의 '사용할 수 없다'.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top