2012-01-05 1 views
1

어떻게 작동합니까? 트랜잭션 주석이있는 메소드입니다. DB 트랜잭션은 가로 챌 때 스프링 트랜잭션으로 열리고 커밋됩니다. 또한 이러한 메소드가 완료되지 않은 동안 DB의 모든 관련 자원이 잠긴 상태로 유지됩니다. 예를 들어 트랜잭션 방식에서 DB의 엔티티가 몇 개 있는데 여러 번 업데이트하거나 제거했습니다. 이 모든 것이 봄 트랜잭션에서 일어나고 DB 트랜잭션은 필요한 잠금이있는 트랜잭션 방식의 끝에서만 발생합니다. ??? 메소드가 멈추는 경우 (예 : 교착 상태), 잠긴 리소스가 DB의 다른 리소스에 대해 잠긴 상태로 유지됩니까? 내가 그렇듯이 ..봄. 봄 (최대 절전) 트랜잭션을 사용하는 DB 트랜잭션 관리

DB (postgresql) state: 

30179 | username | 00:23:05.688157 | IDLE in transaction 
6739 | username | 00:23:13.02717 | IDLE in transaction     
6748 | username | 00:23:15.266922 | IDLE in transaction 
25595 | username | 00:23:22.382349 | IDLE in transaction 
25595 | username | 00:23:22.382349 | IDLE in transaction 

모두 잠금 장치 (23, 21, 20, 5, 6)가 있습니다. 어떻게 이런 일이 일어날 수 있니? 나는 오랫동안 일하지 않았다. 교착 상태 만 : D 그러나 이것은 일어나지 않아 !! 그래서 일부 트랜잭션 메서드가 멈추지 만 리소스가 잠긴 상태로 유지됨에 따라 다른 트랜잭션이나 다음 트랜잭션이 잠겨져 잠긴 리소스를 기다리고 일부 시스템이 잠시 작동을 멈췄습니다.

답변

1

모두 스프링과 관련이 없습니다. 그것은 "정상적인"거래입니다.

거래의 의미는 정확히 transaction isolation level에 달려 있습니다.

@Transactional으로 시작하는 메소드를 입력 한 경우 DB 수준의 트랜잭션이 시작되었습니다 (또는 적어도 다음 SQL 문이 실행될 경우). 해당 메소드를 종료하면 트랜잭션이 커밋됩니다.

주석에는 현재 스레드에 대한 트랜잭션이 이미 존재하는 경우 수행 할 작업을 제어하는 ​​매개 변수가 있습니다..

+0

그래서 트랜잭션 방식으로 걸려있는 경우 잠긴 DB의 리소스도 잠겨 있습니다. Thats 아주 나쁜. 나는 이런 행동을 믿지 않는다. DB에서 시간이 많이 걸리는 트랜잭션이 있어서는 안된다. – whatswrong

+0

나는 DB가 타임 아웃에 의해 교착 상태를 "감지"할 것으로 기대한다. – Ralph

+0

그게 전부입니다. 하지만 자바에서 교착 상태 또는 매우 오랜 동작이있었습니다. 위의 내용은 트랜잭션에 20 분 이상이 걸린 DB 프로세스입니다. 자원도 공개되지 않았다. 그래서 스프링/하이버 네이트 트랜잭션이 DB와 ​​어떻게 협력하는지 궁금합니다. – whatswrong