2010-12-04 2 views
13

나는 다음과 같은 코드가있는 경우 : 사이에서최대 절전 모드 및 트랜잭션과 잠금 테이블

beginTransaction(); 
// lots of stuff happens, can take anywhere from a minute to several minutes. 
// it will read from several tables via calling getter methods on lazy relationships. 
commitTransaction(); 

을, 시작하고 커밋 이후에 고정되는 것을 읽고되고있는 테이블이있는 것이 원인 문제에서 위의 동일한 코드가 다른 사용자에 의해 호출 될 때 문제가 발생하는 다중 사용자 환경?

위의 경우 문제가 발생하면 항상 트랜잭션을 짧게 유지해야합니까? 이를 용이하게하기 위해 게으른 관계에 getter 메소드를 호출하는 대신 트랜잭션을 짧게 유지하는 것이 가장 좋으며 부모의 자식을 수동으로 찾는 방법이 있습니까?

답변

18

Hibernate는 읽은 테이블을 명시 적으로 잠그기 위해 아무 것도하지 않을 것이다. 대답은 실제로 사용중인 데이터베이스와 격리 수준이 설정되는 대상에 따라 다릅니다. 행을 읽음으로써이 세기에 작성된 완전한 기능의 데이터베이스에서 잠금을 발생 시켜서는 안됩니다. 멀티 버전 데이터베이스의 경우, 명시 적으로 행을 잠그지 않는 한 아무 것도 잠기지 않습니다.

귀하의 트랜잭션은 원자 단위 작업에 필요한 모든 길이 여야합니다. 길이가 맞거나 틀립니다. "여기서 일어나는 모든 일이 하나의 단위로 성공하거나 실패 할 수 있습니까? 한 장이 모두 실패하면 모두 롤백됩니다." 이것이 거래를 설정 한 범위입니다.

게으른 로딩을 위해 트랜잭션이 필요하지 않음을 기억하십시오! 방금 열린 세션이 필요합니다. 두 사람은 연결되어 있지 않습니다. 트랜잭션을 커밋하고 세션을 열어 지연로드를 계속 유지할 수 있습니다.

4

가장 좋은 것은 트랜잭션을 짧게 유지하는 것입니다. 잠금 의미론은 트랜잭션 격리 수준에 따라 달라집니다.

Open Session In View은 게으른 페칭/관계에 대해 이야기 할 때 찾고있는 패턴입니다.