Hibernate Transaction 작업 수행 시, setAutoCommit 동작 순서
Transaction 시작
-> setAutoCommit(false)
-> 쿼리 1 수행
-> 쿼리 2 수행
-> setAutoCommit(true)
-> Commit 또는 Rollback
Hibernate가 매번 setAutoCommit(false) & setAutoCommit(true) 설정을 해야하므로, 불필요한 실행시간이 발생 (2ms ~ 4ms)
또한 setAutoCommit 은 실제 DB에 직접 쿼리(set autocommit = {true or false}) 를 날리게 됨 -> 비효율적
※ setAutoCommit(true) 로 다시 설정하는 이유
트랜잭션을 위해 false 로 설정했던 auto commit을 기존 설정인 true 로 되돌려놓기 위함이다.
커넥터의 구현체를 보면 알 수 있음
< MariaDbConnection.java >
/**
* Sets whether this connection is auto commited.
*
* @param autoCommit if it should be auto commited.
* @throws SQLException if something goes wrong talking to the server.
*/
public void setAutoCommit(boolean autoCommit) throws SQLException {
if (autoCommit == getAutoCommit()) return;
try (Statement stmt = createStatement()) {
stateFlag |= ConnectionState.STATE_AUTOCOMMIT;
stmt.executeUpdate("set autocommit=" + ((autoCommit) ? "1" : "0"));
}
}
setAutoCommit() 을 하지 않는 방법
hibernate.connection.provider_disables_autocommits = true 로 설정하면 DB 커넥션의 autoCommit 설정에 따른다.
이때, DBCP의 autoCommit 설정은 반드시 false로 두어야 한다.(중요)
- 만약 hibernate.connection.provider_disables_autocommits = false 로 설정하면, DB 커넥션의 설정을 믿지 않는다는 의미로, getAutoCommit() 을 호출해 DBCP의 설정이 적절하지않으면 setAutoCommit을 통해 변경한다.
- 만약 hibernate.connection.provider_disables_autocommits = true 로 설정하고, DBCP의 autoCommit 설정은 true로 둔다면?
- DBCP의 설정에 따르는데 auto commit 이 true 로 설정됐으므로, Transaction이 동작하지 않는다.
참조
- https://pkgonan.github.io/2019/01/hibrnate-autocommit-tuning
'Spring JPA' 카테고리의 다른 글
[Spring Data Common] Repository, @NoRepositoryBean (0) | 2021.08.23 |
---|---|
[Spring Data JPA] JpaRepository를 상속받기만 하면 빈으로 등록된다? (0) | 2021.08.23 |
[JPA] JPA 기초 (4) | 2021.08.23 |
댓글