반응형
spring에서 사용하는 annotation 중 하나인 이 Transactional annotation에 대해 소개하려고 한다.
사용은 메서드 상단에 설정을 해준다.
예제는 아래와 같다.
@Transactional public void interal() { serviceA.transactionalTest(); serviceA.transactionalTest(); serviceA.transactionalTest(); throw new ExceptionEx("errr"); } |
이미 검색을 하고 들어온 순간부터 Transactional 이라는 애가 뭘 하는 애인지는 알거라 생각하지만 간단히 설명하면
스프링 내에서 AOP 원리로 동작을 하며 Transactional 로 묶어둔 메서드가 시작부터 종료할때까지 모든 메서드가 정상적으로 종료시 commit / 그렇지 못할시 rollback을 해주는 똑똑한 annotation이다.
예제의 경우엔 serviceA에 transactionalTest라는 함수를 호출하고 해당 함수에는 db에 값을 insert 하는 코드가 있다고 하면
3번 값이 입력 되었다가 Exception이 생겨서 rollback이 이루어진다.
참고로 Transactional 은 unchecked Exception 을 default로 받아서 rollback을 한다.
이 내용은 아래 참고 포스팅을 참고 바란다.
그리고 사실 별 설정을 안해줘도 자동으로 rollback이 되지만 이 annotation은 많은 속성을 갖고 있다.
아래 표를 참고 바란다.
속성명 | 특징 | 옵션 |
isolation | 일관성없는 데이터 허용 수준을 설정 | DEFAULT, READ UNCOMMITTED, READ COMMITTED, REPEATABLE READ, SERIALIZABLE |
noRollbackFor, rollbackFor | 특정 예외발생시 rollback하지않음 or rollback함으로 설정 | |
noRollbackForClassName, rollbackForClassName | 특정 클래스이름인 경우 rollback하지않음 or rollback함으로 설정 | (e.g)rollbackForClassName=”Exception” |
propagation(전파속성) | 트랜잭션 동작 도중 다른 트랜잭션을 호출할 때, 어떻게 할 것인지 설정 | REQUIRED(Defualt), REQUIRES_NEW, SUPPORT, NOT_SUPPORT, MANDATORY, NEVER, NESTED |
readOnly | 트랜잭션을 읽기 전용으로 설정. true면 insert, update, delete 실행 시 예외 발생 | true, false(Defualt) |
timeout, timeoutString | 지정한 시간내에 메서드수행이 완료되지 않으면 rollback함으로설정(단위 : 초,seconds) | |
transactionManager | 특정 Transaction의 qualifier value를 설정 | |
value | transactionManager의 alias(별칭)을 설정한다. |
다른 값들도 유용하지만 노란 블럭에 대해서는 한번 설명을 한다면,
noRollbackFor, rollbackFor, noRollbackForClassName, rollbackForClassName ->
어떤 Exception 이 터지면 롤백을 하거나 안하거나를 설정할수 있음 |
propagation ->
트랜잭션 동작 도중 다른 트랜잭션을 호출할 때, 어떻게 할 것인지 전파속성을 선택할 수 있다. 총 7가지 속성이 있다.
|
간단하게 사용하면 편하지만 복잡한 코드가 들어가게 되면 AOP로 동작을 하다보니 내부 호출에서 문제가 있다.
이 내용은 심화적인 내용이므로 별도 포스팅에서 다뤄볼 예정이다.
참고 포스팅
https://thenicesj.tistory.com/485
반응형
'IT > Java' 카테고리의 다른 글
spring.main.allow-bean-definition-overriding=true 자바Bean중복 에러 (50) | 2023.07.15 |
---|---|
@Transactional 사용시 주의 사항2 (내부호출 / AOP 내부호출) (40) | 2023.07.11 |
Cannot construct instance of Dto 에러 (38) | 2023.07.06 |
Optional<List<Entity>> 잘못된 표기법 (35) | 2023.06.30 |
[Spring] BeanDefinition 이란? (36) | 2023.06.29 |
댓글