복붙노트

[SPRING] JPA 대 플러시 대 커밋

SPRING

JPA 대 플러시 대 커밋

JPA에서 EntityTransaction.commit ()을 호출하면 자동으로 EntityManager.flush ()가 호출됩니까? 아니면 둘 다 호출해야합니까? 그 차이점은 무엇입니까? JPA에 문제가 있기 때문에 엔터티를 데이터베이스에 삽입 할 때 persist ()를 호출합니다. 데이터베이스에서 데이터가 삽입 (가져올 수 있음)되었지만 데이터가 내 앱에 표시되지 않습니다 (findAll ()을 사용하여 데이터를 가져옵니다). 그리고 다른 실체에서, 그것은 나타났다. 내가 모르는 뭔가가 있니? 나는 표준 Spring CRUD, JPA resource_local, postgresql을 사용하고있다. 내 영어에 대한 미안, 미리 감사드립니다.

해결법

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

    1.예

    flush ()에서 데이터에 대한 변경 사항은 flush가 발생하면 데이터베이스에 반영되지만 여전히 transaction.flush ()에 있어야하며 트랜잭션 컨텍스트에 포함되어야하며 필요하지 않으면 명시 적으로 처리하지 않아도됩니다 (드문 경우 있음). ), EntityTransaction.commit ()이이를 수행합니다.

    출처

  2. ==============================

    2.엔티티에 @Version 어노테이션이있는 열이 있고 entityManager.flush ()를 호출하면 OptimisticLockException이 즉시 발생하거나 데이터베이스가이 행 (또는 테이블)을 잠글 것입니다. 이후의 경우에는 setRollbackOnly ()를 호출 할 수 있으며 나중에 DB 변경없이 잠금이 해제됩니다.

    엔티티에 @Version 어노테이션이있는 열이 있고 entityManager.flush ()를 호출하면 OptimisticLockException이 즉시 발생하거나 데이터베이스가이 행 (또는 테이블)을 잠글 것입니다. 이후의 경우에는 setRollbackOnly ()를 호출 할 수 있으며 나중에 DB 변경없이 잠금이 해제됩니다.

    또는 다른 관점에서 flush ()를 사용하면 해당 데이터베이스 행에 (비관적 인) 잠금을 만들 수 있습니다. 다른 사용자는 여전히 이전 항목을 볼 수 있지만 잠금을 해제 할 때까지 업데이트를 시도하면 차단됩니다.

    이 모든 것은 CMT (컨테이너 관리 트랜잭션)에도 해당됩니다. 서비스 메서드가 끝나고 CMT 커밋이 수행되는 순간을 기다리는 대신 서비스 메서드에서 flush () (심지어 여러 번)를 호출하고 OptimisticLockException을 즉시 처리 할 수 ​​있습니다.

  3. ==============================

    3.em.flush () - 엔티티를 트랜잭션에서 데이터베이스에 즉시 저장하여 더 이상 사용하고 롤백 할 수 있습니다.

    em.flush () - 엔티티를 트랜잭션에서 데이터베이스에 즉시 저장하여 더 이상 사용하고 롤백 할 수 있습니다.

    em.getTransaction () .commit - 트랜잭션 종료를 표시하고 트랜잭션 내의 모든 변경 사항을 데이터베이스에 저장하며 롤백 할 수 없습니다.

    https://prismoskills.appspot.com/lessons/Hibernate/Chapter_14_-_Flush_vs_Commit.jsp를 참조하십시오.

  4. from https://stackoverflow.com/questions/28392747/jpa-flush-vs-commit by cc-by-sa and MIT license