트렌잭션이란 데이터베이스의 상태를 변화시키기 위해 수행하는 작업의 단위 또는 한꺼번에 모두 수행되어야 할 일련의 연산들을 뜻한다.
트랜잭션이란?의 게시글을 보면 더 자세한 정보를 알 수 있습니다.
🚨 주의할 점 1
- Transactional내에서 개발자가 강제로 Exception을 실행시키는 코드를 넣을 때는 Checked exception인지 unchecked exception인지 확인을 해야한다.
- Unchecked exception이 발생하면 트렌젝션 내용이 roll back이 되고 Checked exception은 트랜젝션 내에서 발생하여도 roll back되지 않고 반영이 된다❗❗
- Checked exception이 발생하였을 때도 roll back을 시키고 싶다면 @Transactional어노테이션을 @Transactional(rollbackFor = Exception.class)와 같이 해당 exception에 rollback을 시키도록 하면 된다.
🚨 주의할 점 2
- Transactioinal이 붙어있는 A method를 B method에서 호출하였을 때 A에서 unchecked exception이 발생하여도 rollback되지 않는다.
- Spring Container는 Bean으로 진입할 때 달려있는 어노테이션들을 처리하도록 되어 있다.
B라는 메서드에 진입하는 순간 container는 Bean내부로 들어왔기에 B내부에서 다른 메서드인 A를 호출 할 시 A의 메서드에 있는 어노테이션들은 무시가 된다.- Ex) putBookAndAuthor을 put에서 호출하여 사용하는 경우 @Transactional은 적용되지 않는다.
public void put() { this.putBookAndAuthor(); } @Transactional public void putBookAndAuthor(){ Book book = new Book(); book.setName("JPA 시작하기"); bookRepository.save(book); Author author = new Author(); author.setName("Seongwon"); authorRepository.save(author); throw new RuntimeException("오류가 나서 DB commit이 발생하지 않았습니다."); }
트랜잭션의 격리 수준이란 동시에 여러 트랜잭션이 처리될 때 특정 트랜잭션이 다른 트랜잭션에서 변경하거나 조회하는 데이터들을 볼 수 있도록 허용할지 말지를 결정하는 것이다.
Spring의 @Transaction의 Isolation속성은 아래와 같이 지정하면 된다.
@Transactional(isolation = Isolation.~~)
public void methodName(Long id) {
}
트랜잭션 격리 수준에 대한 자세한 정보는 트랜잭션의 격리수준에서 설명하였으니 참고하시길 바랍니다.
Isolation의 속성의 종류는 다음과 같다.
트랜잭션 동작 도중 다른 트랜잭션을 호출하는 상황에 선택할 수 있는 옵션이다.
Propagation속성에 따라 피호출 트랜잭션의 입장에서는 호출자의 트랜잭션을 사용할 수도 있고 새롭게 트랜잭션을 생성할 수도 있다.
Spring의 @Transaction의 Propagation속성은 아래와 같이 지정하면 된다.
@Transactional(propagation = Propagation.~~)
public void methodName(Long id) {
}