DevBoi

AutoCommit? 본문

[DataBase]

AutoCommit?

HiSmith 2023. 5. 8. 22:11
반응형

테스트 컨테이너와 Spock를 이용해서 테스트 환경을 구축하다가 DB autocommit을 끄는것에 대해서

공부를 해보려고했다. (팀에 고수분이 의견을 주셨다)

 

1.Autocommit은 무엇일까?

하나의 트랜잭션은 commit이나 rollback을 만나면 종료된다.

트랜잭션의 성질은 ACID를 따르는데 (이건 모르면 직접 찾아보시길)

 

1,2,3작업이 있다고 가정 한 트랜잭션에 있다면?

1번 작업 후 2번 작업중 이슈가 생기면? 1번 작업은 commit이 될까?

같은 트랜잭션 이라면 2번이 롤백되면서 1번도 롤백된다.

 

다만 오토 커밋이라고하면 commit을 따로 날려주지않아도 자동으로 커밋되는것이다.

즉 하나의 트랜잭션 내에 여러가지의 쿼리가 있다고 하더라도, 무용지물로 그냥 다 반영 되는것이다. 

쉽게 얘기하면, 트랜잭션 그딴거 없고 하나씩 다 바로바로 반영 이다.

 

 

2. Autocommit 보는 방법 

select @@AUTOCOMMIT; //조회

SET AUTOCOMMIT = 1; // 해제

SET AUTOCOMMIT = 0; // 설정

 

3.스프링 에서 Autocommit 관련 설정

 

1) dataSource Bean

<bean id="dataSource" class="org.apache.tomcat.jdbc.pool.DataSource"
        destroy-method="close"
        p:driverClassName="oracle.jdbc.OracleDriver" p:url="jdbc:oracle:thin:@localhost:1521:XE"
        p:defaultAutoCommit="false"
        p:username="scott"
        p:password="tiger"
        p:initialSize="10"
        p:minIdle="10"
        p:maxIdle="100"
        p:maxActive="100"
        p:maxWait="6000"    
    />

True가 기본값이라서, 아무런설정을 안하면 autocommit이 켜있다.

 

스프링 부트에서는 해당 값으로 설정이 가능하다.

 

spring.datasource.tomcat.default-auto-commit=true

 

 

그러면, 테스트 환경에서 소스가 돌때 어떤 방법이 제일 편할까?

아쉽게도 소스상에서 돌리는 것보다, 어노테이션으로 설정할 수 있다.

스프링에서는 @Test 와 함께 작성된 @Transactional은 항상 Rollback된다.

 

이를 막기위해서는

@Rollback에 대한어노테이션에서 false로 지정을 같이 해주거나

아래와 같이 작성을 해주면 된다.

@TransactionConfiguration(transactionManager="transactionManager", defaultRollback=false)
public class ContactDAOTest {
...
}

 

반응형