하이버네이트에서 Nontransactional data access
Hibernate/Chapter 10 : 2008. 4. 1. 17:11
Session session = sessionFactory.openSession();
session.get(Item.class, 123l);
session.close();
- Session이 열리고 이 순간 Connection을 얻어오진 않는다.
- get()을 호출하는 순간 Select 문을 날리는데, 이 때 Connection을 pool에서 꺼낸다. 하이버네이트는 기본으로 그 즉시 autocommit mode를 끈다. setAutoCommit(false). 이렇게 효율적으로 JDBC 트랜잭션을 시작한다.
- SELECT는 JDBC 트랜잭션 내부에서 실행된다. 하이버네이트는 Connection의 close()를 호출하여 Connection을 poll에 반납한다. 이 때 남아있는 트랜잭션은 어떻게 될까?
- 사용하는 DB에 달려있다. JDBC 스펙에서는 이 것과 관련되서 정해논게 없다.
- 오라클은 트랜잭션을 커밋한다.
- 다른 많은 JDBC 밴더들은 트랜잭션을 롤백한다.
- 위는 Select 문이라서 상관없지만, sequence를 가져온 다음에 INSERT은 날리지 않고 flush 될 때까지 기다린다. 그러다 그냥 끝나게 되니까 INSERT 문이 날아가지 않는다.
- idendity 전략으로 PK를 생성할 때에는 DB에 들어가야 얻을 수 있으니까, INSERT문이 바로 날아간다.
- 이렇게 트랜잭션 경계를 설정하지 않으면 위와 같은 일이 발생하는데, 이때에는 JDBC 커넥션을 오토커밋 모드로 설정해준다.
<property name="connection.autocommit">true</property>
- 즉 DB Connection을 가져올 때 setAutoCommit(false) 이걸 호출하지 않는다.
'Hibernate > Chapter 10' 카테고리의 다른 글
하이버네이트 VS JPA (0) | 2008.09.09 |
---|---|
하이버네이트에서 Nontransactional data access (0) | 2008.04.01 |
autocommit에 관한 오해 (0) | 2008.04.01 |
Isolation 단계 더 높이기 (2) | 2008.03.30 |
낙천적인 동시접근 제어 (2) | 2008.03.28 |
DB 수준에서 동시접근 이해하기 (4) | 2008.03.28 |
동시접근 제어하기 (0) | 2008.03.28 |
하이버네이트 애플리케이션의 트랜잭션 (0) | 2008.03.27 |
데이터베이스와 시스템 트랜잭션 (0) | 2008.03.27 |
트랜잭션 기초 (0) | 2008.03.27 |