복붙노트

[SPRING] JPA 동시성 문제 "배치 릴리스시 여전히 JDBC 문이 포함되어 있습니다"

SPRING

JPA 동시성 문제 "배치 릴리스시 여전히 JDBC 문이 포함되어 있습니다"

최대 재시도 횟수에 도달 할 때까지 엔티티를 여러 번 저장하려고하는 while 루프로 해결하려고 한 동시성 문제가 있습니다. 이 문제를 해결할 다른 방법이 있는지에 대해 이야기하고 싶지 않습니다. 그것에 대해 다른 Stackoverflow 게시물이 있습니다. :) 간단히 말해 : 컬럼에는 고유 제한 조건이 있으며 충돌을 피하기 위해 계속 증가하는 숫자 부분을 포함합니다. 루프에서, 나는 :

루프가 1 단계로 돌아가서 선택하려고 할 때를 제외 하고는이 모든 것이 작동하는 것 같습니다.

17:20:46,111 INFO  [org.hibernate.engine.jdbc.batch.internal.AbstractBatchImpl] (http-localhost/127.0.0.1:8080-3) HHH000010: On release of batch it still contained JDBC statements
17:20:46,111 INFO  [my.Class] (http-localhost/127.0.0.1:8080-3) MESSAGE="Failed to save to database. Will retry (retry count now at: 9) Exception: could not execute statement; SQL [n/a]; constraint [SCHEMA_NAME.UNIQUE_CONSTRAINT_NAME]; nested exception is org.hibernate.exception.ConstraintViolationException: could not execute statement"

그리고 새로운 예외가 발생합니다. 고유 제약 조건 위반이 발생하고 DataAccessException을 throw하는 첫 번째 플러시처럼 엔티티 관리자의 배치를 지우지 않습니다. 이것을 처리하는 적절한 방법은 무엇입니까? JPA와 함께 Spring을 사용하고 있으며 엔티티 관리자에 직접 액세스 할 수 없습니다. 필요한 경우 주사 할 수있을 것 같지만이 문제에 대한 고통스러운 해결책입니다.

해결법

  1. ==============================

    1.이를 수행 할 수 없습니다. 일단 무언가를 플러시하고 실패하고 예외가 발생하면 트랜잭션은 롤백으로 표시됩니다. 즉, 예외를 잡아서 진행해도 문제가되지 않으며 결국 롤백이 발생합니다. 실제로 어떤 예외가 발생했는지는 중요하지 않습니다. 기본적으로 Spring의 트랜잭션 관리자는 검사되지 않은 모든 예외를 롤백합니다. @Transactional 주석에 noRollbackFor를 구체적으로 정의하여이를 극복 할 수 있습니다 (주석 드라이버 트랜잭션을 사용하는 경우).

    이를 수행 할 수 없습니다. 일단 무언가를 플러시하고 실패하고 예외가 발생하면 트랜잭션은 롤백으로 표시됩니다. 즉, 예외를 잡아서 진행해도 문제가되지 않으며 결국 롤백이 발생합니다. 실제로 어떤 예외가 발생했는지는 중요하지 않습니다. 기본적으로 Spring의 트랜잭션 관리자는 검사되지 않은 모든 예외를 롤백합니다. @Transactional 주석에 noRollbackFor를 구체적으로 정의하여이를 극복 할 수 있습니다 (주석 드라이버 트랜잭션을 사용하는 경우).

    편집-트랜잭션이 데이터베이스 수준에서 롤백으로 표시 될 수 있으므로이 제약 조건 위반의 경우에는 도움이되지 않습니다.

  2. from https://stackoverflow.com/questions/39734796/jpa-concurrency-issue-on-release-of-batch-it-still-contained-jdbc-statements by cc-by-sa and MIT license