2011-04-13 1 views
2

Spring Framework 3 및 Hibernate 3.6을 사용하는 웹 애플리케이션에서 작업하고 있으며 트랜잭션 관리가 어떻게 작동하는지 이해하려고 노력합니다. InnoDB 테이블과 함께 mySQL Server 5.1을 사용합니다. 나는 평범한 Hibernate 3 API를 기반으로 DAO를 작성했다.Spring, Hibernate 및 mySQL을 이용한 트랜잭션 관리

1) mySQL 서버 자체에서 트랜잭션 처리 방법을 지정 했습니까? 즉, 언제 레코드를 잠글 필요가 있는지 여부를 결정합니다.

2) 나는 datarecords 트랜잭션 동안 잠겨있는 경우는 true) 또는 @Transactional @Transactional (읽기 전용 =이 (읽기 전용 = false)를이 영향을 미치지 않는 한 봄의 메소드를 선언? 즉, readOnly = true이면 데이터 코드가 잠기지 않고 readOnly = false 일 때 사용 된 모든 데이터 코드가 잠겨 있습니까?

3) readOnly = true가되어 다양한 데이터 레코드를 읽으면 어떻게됩니까? 읽는 중간에 다른 트랜잭션에 의해 변경된 것으로 가정하여 오래된 레코드와 새로운 레코드를 얻습니다. 그게 가능하니?

4) 커밋은 언제 발생합니까? 트랜잭션이 성공한 후 또는 세션이 닫힌 후?

5) 최대 절전 모드 세션은 언제 시작합니까? 각 세션 (서버와 클라이언트 간) 또는 각 트랜잭션마다?

6) 누가 결국 거래 관리 책임이 있습니까? 봄 또는 MySQL 또는 둘 다?

답변 해 주셔서 감사합니다. :-)

답변

4

1) mySQL Server 자체에서 트랜잭션 처리 방법을 지정 했습니까? 즉, 언제 레코드를 잠글 필요가 있는지 여부를 결정합니다.

본질에서이 - 예, 거래의 구현은 DBMS

의 책임

2), 3) ...

readOnly 거래와 아무 상관이있다, 그것은 힌트입니다 Hibernate에 대해 Hibernate는로드 된 객체에 대한 변경 사항을 데이터베이스에 전파해서는 안된다. (즉, 트랜잭션이 데이터베이스에 변경 사항을 쓰는 것이 아니라면 성능 힌트로 지정할 수있다.)

4) 커밋은 언제 발생합니까? 트랜잭션이 성공한 후 또는 세션이 닫힌 후?

커밋은 트랜잭션을 종료하는 동작입니다 (다른 트랜잭션은 롤백입니다). 따라서 트랜잭션이 끝날 때 트랜잭션이 종료됩니다.

5) 최대 절전 모드 세션은 언제 시작합니까? 각 세션 (서버와 클라이언트 간) 또는 각 트랜잭션마다?

기본적으로 -보기 지원에서 열린 세션을 구성하지 않는 한 각 트랜잭션마다.

6) 누가 트랜잭션 관리를 담당합니까? 봄 또는 MySQL 또는 둘 다?

데이터베이스는 트랜잭션 동작의 구현을 제공합니다. Spring은 경계를 정의하고 커밋/롤백을 트리거하여 트랜잭션을 관리합니다.

+0

감사합니다. :-) 레코드를 잠그는 것은 mySQL의 책임이며 데이터 레코드를 읽는 것은 잠금을 유발하지 않는다? "readOnly"가 트랜잭션과 아무 관계가 없다고하더라도이 트랜잭션 동안 데이터 읽기가 잠기지 않는다는 것은 독서가 잠금을 유발하지 않기 때문에? – nano7

+0

@ nano7 : 잠금과 같은 구현 세부 사항은 데이터베이스 엔진에 따라 다르며 InnoDB가 어떻게 처리하는지 잘 모르겠습니다. – axtavt

+0

오케이, 고마워요! :-) – nano7