
같은 클래스 내에 여러 @Transcation method를 호출할 경우 의도와는 다르게 동작하는 경우가 있습니다.
@Transcational
fun void createUserList() {
for (i in 1..10) {
createUser(i)
}
}
@Transcational
fun createUser(index: Int) {
val user = User(name = "testname: $i", email = "[email protected]")
userRepository.save(user)
}
만약 User를 Insert 하는 중 RuntimeException이 발생하게되면 일부 데이터는 Commit이 될거라고 생각 할 수 있다. 하지만 DB를 조회해보면 Insert 된 데이터의 갯수는 0개임을 확인할 수 있다.
Transcational가 붙은 메소드를 Proxy가 확장해서 사용하기에 private 키워드를 붙인 메소드들은 확장할 수 없으므로 사용이 불가능 하다.
Transacational이 붙은 메소드 안에서 Transaction이 붙은 경우 상위 메소드의 붙은 Transcational의 귀속되어 어노테이션을 붙이지 않은 것처럼 동작된다.