트랜잭션 전파와 격리 레벨
현재 진행 중인 트랜잭션이 있는 상태에서 새로운 트랜잭션을 시작하고 싶다면 다음과 같이 새로운 커넥션을 가져와 트랜잭션을 시작할 수 있다.
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 프로그래밍 (최범균 저)
'Spring' 카테고리의 다른 글
| [Spring] 스프링 데이터베이스(4) - 트랜잭션 (0) | 2022.04.25 |
|---|---|
| [Spring] 스프링 데이터베이스(3) - DataSource 설정 (0) | 2022.04.19 |
| [Spring] 스프링 데이터베이스(2) - 익셉션 처리 (0) | 2022.04.18 |
| [Spring] 스프링 데이터베이스(1) - 템플릿 클래스 (0) | 2022.04.17 |
| [Spring] 스프링 MVC(19) - 서블릿 3 기반 설정 (0) | 2022.04.16 |