Spring

[Spring] 스프링 데이터베이스(5) - 트랜잭션 전파와 격리 레벨

재담 2022. 4. 28. 00:14

트랜잭션 전파와 격리 레벨

현재 진행 중인 트랜잭션이 있는 상태에서 새로운 트랜잭션을 시작하고 싶다면 다음과 같이 새로운 커넥션을 가져와 트랜잭션을 시작할 수 있다.

Connection conn = getConnection();
conn.setAutoCommit(false);

// 중간 생략
...
    
    Connection connNew = getConnection();
    connNew.setAutoCommit(false); // 새로운 커넥션으로 트랜잭션 시작
    
    // 중간 생략
    ...
    
    connNew.commit(); // 새로운 트랜잭션 종료
    connNew.close();
    
// 중간 생략
...

conn.commit();
conn.close();

스프링은 새로운 트랜잭션을 새로 생성하는 것뿐만 아니라 기존 트랜잭션을 그대로 사용하거나 기존에 트랜잭션이 진행 중인 상태에서 현재 코드를 실행하는 등의 트랜잭션 전파와 관련된 부분을 설정으로 지정할 수 있도록 지원하고 있다. 스프링이 제공하는 트랜잭션 전파 지원은 다음과 같다.

  • REQUIRED : 메서드를 수행하는 데 트랜잭션이 필요하다는 것을 의미한다. 현재 진행 중인 트랜잭션이 존재하면, 해당 트랜잭션을 사용한다. 존재하지 않는다면 새로운 트랜잭션을 생성한다.
  • MANDATORY : 메서드를 수행하는 데 트랜잭션이 필요하다는 것을 의미한다. 진행 중인 트랜잭션이 존재하지 않을 경우 익셉션을 발생시킨다.
  • REQUIRES_NEW : 항상 새로운 트랜잭션을 시작한다. 기존 트랜잭션이 존재하면 기존 트랜잭션을 일시 중지하고 새로운 트랜잭션을 시작한다. 새로 시작된 트랜잭션이 종료된 뒤에 기존 트랜잭션이 계속된다.
  • SUPPORTS : 메서드가 트랜잭션을 필요로 하지는 않지만, 기존 트랜잭션이 존재할 경우 트랜잭션을 사용한다는 것을 의미한다. 진행 중인 트랜잭션이 존재하지 않더라도 메서드는 정상적으로 동작한다.
  • NOT_SUPPORTED : 메서드가 트랜잭션을 필요로 하지 않음을 의미한다. 진행 중인 트랜잭션이 존재할 경우 메서드가 실행되는 동안 트랜잭션은 일시 중지되며, 메서드 실행이 종료된 후에 트랜잭션을 계속 진행한다.
  • NEVER : 메서드가 트랜잭션을 필요로 하지 않으며, 만약 진행 중인 트랜잭션이 존재하며 익셉션을 발생시킨다.
  • NESTED : 기존 트랜잭션이 존재하면, 기존 트랜잭션에 중첩된 트랜잭션에서 메서드를 실행한다. 기존 트랜잭션이 존재하지 않으면 REQUIRED와 동일하게 동작한다. 이 기능은 JDBC 3.0 드라이버를 사용할 때에만 적용된다.

 

스프링에서 설정 가능한 트랜잭션 격리 레벨은 다음과 같다.

  • DEFAULT : 기본 설정을 사용한다.
  • READ_UNCOMMITTED : 다른 트랜잭션에서 커밋하지 않은 데이터를 읽을 수 있다.
  • READ_COMMITTED : 다른 트랜잭션에 의해 커밋된 데이터를 읽을 수 있다.
  • REPEATABLE_READ : 처음에 읽어 온 데이터와 두 번째 읽어 온 데이터가 동일한 값을 갖는다.
  • SERIALIZABLE : 동일한 데이터에 대해서 동시에 두 개 이상의 트랜잭션이 수행될 수 없다.

Reference

  • 웹 개발자를 위한 Spring 4.0 프로그래밍 (최범균 저)