2011-08-18 8 views
0

우리는 프로젝트에서 Spring과 Hibernate를 사용하며 계층화 된 Architechture를 사용합니다. 컨트롤러 -> 서비스 -> 관리자 -> Dao. 거래는 Manager 계층에서 시작됩니다. db의 객체를 업데이트하는 서비스 계층의 메소드는 많은 스레드에 의해 호출되며 이는 부적절한 객체 제거를 유발합니다. 그래서이 메소드를 Synchronized로 만들었고 부실 오브젝트 예외가 발생하는 것을 볼 수 있습니다. 여기서 내가 뭘 잘못하고 있니? 이 사건을 다루는 더 좋은 방법이 있니?스프링 트랜잭션 동기화

미리 도움을 주셔서 감사합니다.

답변

3

부실 오브젝트 예외는 읽은 시간과 갱신 된 시간 사이에 엔티티가 수정되면 발생합니다. 이것은 단일 트랜잭션 내에서 발생할 수 있지만 트랜잭션의 객체를 읽고,이를 (예 : 컨트롤러 계층에서) 수정 한 다음 다른 트랜잭션을 시작하고 병합/업데이트 할 경우에도 발생할 수 있습니다 (이 경우 분 또는 시간 읽기와 업데이트를 분리 할 수 ​​있습니다).

사용자 간의 충돌을 피할 수 있도록 예외가 throw됩니다.

충돌에 대해 신경 쓰지 않는다면 (즉, 마지막 업데이트가 항상 승리하고 이전 것의 내용을 대체 한 경우) 낙관적 잠금을 사용하지 마십시오. 충돌이 염려되는 경우 StaleObjectExceptions이 발생하고 최종 사용자에게 의미있는 메시지를 표시하고 데이터를 다시로드하고 다시 수정하도록 요청해야합니다. 그들을 피할 방법이 없습니다. 당신은 낙관적이어야하며 그들이 자주 일어나지 않을 것을 희망해야합니다. 읽고 엔티티

  • 업데이트는
  • 응용 프로그램은이 서비스에 의해 만들어진 동일한 트랜잭션에서 작성할 때 동기화 된 트릭을 경우에만

    • 예외를 작동

      주에만 발생 클러스터되지 않았습니다.

    동시 트랜잭션에 의해 업데이트되는 엔티티에 관계없이 동시 업데이트를 금지하므로 처리량도 크게 감소 할 수 있습니다. 전체 거래 기간 동안 전체 테이블을 잠근 경우와 같습니다.

  • 관련 문제