트랜잭션 내부에서 새로 고침하지 않는 MySQL보기 (Hibernate / Spring)
문제
MySQL 데이터베이스에서 DI와 Hibernate 용 Spring을 사용하고 있습니다.테이블에 레코드를 삽입 한 다음 테이블을 쿼리하고 일부 집계 계산을 수행하는 뷰를 실행하는 트랜잭션 안에 코드가 있습니다.내가 보는 문제는 동일한 트랜잭션 동안 방금 삽입 된 레코드가 뷰의 계산 된 값에 포함되어 있지 않다는 것입니다.MySQL Workbench에서 동일한보기를 실행하고 삽입 된 값이보기에 포함됩니다.누구 든지이 일을 원한지 알고 있습니까?
해결책
궁극적으로, EntityManager.refresh (Object Entity)를 호출하여 업데이트 된 뷰 레코드의 엔티티를 새로 고치면됩니다.문제는 Hibernate가 업데이트 된 원래 엔티티에 종속 (데이터베이스 수준에서)을 알지 못해보기가 뷰를 업데이트해야한다는 사실을 인식 할 수 없다고 생각합니다.나는 Hibernate가보기에서 레코드를 캐싱하고 플러시 () 후에도 갱신해야한다는 것을 알지 못합니다.
Hibernate는 원래 테이블과 뷰를 완전히 무관 한 것으로 보이고 현실이 테이블에 의존하고 테이블이 변경 될 때마다 "더티"를 만들어야합니다.나는 그것을 인식하기 위해 최대 절전 모드를 얻는 방법을 모른다.
다른 팁
아직 데이터베이스에 대한 변경 사항을 플러시하지 않았을 것입니다.Hibernate는 나중에 읽는 행을 삽입하고 뷰를 삽입 한 테이블 사이에 연결이 있음을 알지 못합니다.뷰를 쿼리하기 전에 EntityManager (또는 세션 또는 템플릿)를 세척하십시오.
이것은 REPEATABLE READ
인 MySQL의 기본 분리 수준으로 인해 발생합니다.
이것은 MySQL Workbench의 트랜잭션이 끝 트랜잭션까지 변경되지 않습니다.선택을 트랜잭션으로 실행합니다.
커밋 (또는 롤백)을 발행하면 MySQL Workbench의 변경 사항이 표시되어야합니다.
설치의 기본 분리 수준을 READ COMMITTED
에 변경하거나 MySQL Workbench에서 세션의 격리 수준을 READ COMMITTED
어떻게하는 방법에 대한 세부 사항을 설명합니다.