1. private은 @Transactional이 적용되지 않는다.

2. 같은 클래스 내의 여러 @Transaction method 호출

같은 클래스 내에 여러 @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로 동작한다.

  1. Transcational가 붙은 메소드를 Proxy가 확장해서 사용하기에 private 키워드를 붙인 메소드들은 확장할 수 없으므로 사용이 불가능 하다.

  2. Transacational이 붙은 메소드 안에서 Transaction이 붙은 경우 상위 메소드의 붙은 Transcational의 귀속되어 어노테이션을 붙이지 않은 것처럼 동작된다.

References: