@Transactional (1)
@Transactional 은 Aop 의 관점에서는 사용하기는 편리하지만 , 개발자가 동작원리를 이해를 기반으로 해야 효과적인
troubleshooting 이 가능하다 라고 생각한다.
학생 Id 를 이용하여 , 10 명의 학생 객체를 만들려고 한다.
식별자는 db 에서 생성을 받는다하자.
다음 코드가 동작을 정상적으로 할까 ?
@Service
public class SomeService {
@Transactional
public void methodA(int studentId) {
Student member = new Student(studentId)
}
@Transactional
public void methodB() {
for(int i = 0 ; i < 10 ;i++) {
methodA(i)
}
}
}
또는 ,
다음과 같이 서비스 레이어에서 트랜잭션이 걸려있는 메서드를 트랜잭션 어노테이션이 없는 메서드 B에서 호출을 한다.
어떤일이 일어 날까 ?
@Service
public class SomeService {
@Transactional
public void methodA() {
// ...
}
public void methodB() {
// ...
methodA();
// ...
}
}
두번째 질문의 답을 먼저한다 .
스프링에서의 @Transactional 어노테이션이 붙은 클라스의 메서드는 클라이언트에서 런타임시 직접적으로 호출이 되지 않고
프록시 객체를 통하여 호출이 된다. 이는 프록시 내부에서 내부를 호출시 Transaction 은 적용이 되지 않는다.
위의 이유로 우리는 Private 접근자로 @Transactional 을 선언을 할 수가 없다.
즉 @Transactional 가 없는 methodB 를 호출시 트랜잭션이 시작되지 않는다.
methodB에서 methodA 를 호출시 , Transaction 적용이 안된다.
이번에는 첫 번째 문제를 보자 ,
@Service
public class SomeService {
@Transactional
public void methodA(int studentId) {
Student member = new Student(studentId)
}
@Transactional
public void methodB() {
for(int i = 0 ; i < 10 ;i++) {
methodA(i)
}
}
}
methadA 에도 트랜젝션이 있으니 객체를 생성할 것 같지만 ,
같은 클라스에서 메서드의 호출에 따란 Transaction 의 중복은 의미가 없이 최초 Transaction 을 기준으로 동작한다.
즉 methodB 를 호출해도 데이터 베이스에서 10 명의 학생은 볼 수가 없다 , methodB 의 transactional 을 빼주자,
다음과 같이 서로 다른 클라스에서 메서드 각각 트랜 젝션이 걸려 있는 상태에서는 롤백이 어떻게 될까 ?
@Service
public class TotalService {
...
@Transactional
public void methodB() {
someService.methodA();
otherService.methodG();
myService.methodE();
}
}
각 서비스 매서드 , 로컬 트랜잭션 3 개는 부모 트랜잭션인 methodB 의 트랜잭션의 합류하여 수행이된다.
즉 , 모두 같은 트랜잭션이 됨으로 어느 하나의 로직이 잘못되어 문제가 발생하면 전부 롤백 된다.
(트랜잭션 전파 수준에 따라 달라지며 위 설명은 기본 설정인 상황이다.)
참고 :
https://dev-coco.tistory.com/163
신입 개발자 기술면접 질문 정리 - 백엔드
💡 WAS(Web Application Server)와 WS(Web Server)의 차이를 설명해주세요. WAS(Web Application Server) 비즈니스 로직을 넣을 수 있음 Tomcat, PHP, ASP, .NET 등 WS(Web Server) 비즈니스 로직을 넣을 수 없음 Nginx, Apache 등
dev-coco.tistory.com
[Spring] @Transactional 간략 정리 ( AOP, Proxy, 동작 원리, 특이사항 )
@Transactional의 동작 원리와 @Transactional을 사용하면서 생기는 이슈들에 대한 간략 정리 1. DB Transaction ACID 원자성(Atomicity) - 트랜잭션에 속한 각각의 문(데이터를 읽기, 쓰기, 업데이트 또는 삭제하
kangyb.tistory.com