Today I Learned
Spring_transaction 본문
transaction(트랜잭션)이란?
: 데이터베이스에서 사용되는 쪼갤 수 없는 업무처리의 단위
- 하나의 작업 내부의 과정이 잘못되면 전부 취소됨 , 한쪽에서 실패하면 다 실패 all or nothing
- 예시 송금하려고 출금 - 입금 출금에서안되면 임금도안됨
- 링크클릭 - 조회수 올라감 - 불러오는데 실패 그럼 조회수도 안올라가게되는
- 실제 작업은 1개가 아닌데 1개처럼 움직여야함
- 한쪽에서 실패하면 다 실패
- 작업이 분리되면 안된다.
- 한번 commit 되면 되돌릴 수 없음
- Commit 안되면 rollback 할수 있음
- 두가지 작업이 하나로 묶여있을 때 *transaction을 쓴다
두개의 쿼리가 하나처럼 움직임
예시) 상세보기와 조회수 & 결제하기 : 상세보기를 불러오는걸 못했으면 조회수도 올리면 안됨/ 결제하다가 에러나서 취소되면 구매되면 안됨
예시) 트랜잭션이 제일 필요한 부분은 결제! 결제하다가 에러나면 다 취소해야함
transaction 처리 방법
1. 라이브러리 필요_pom.xml에 추가
Cglib 3.2.4
<!-- 트랜잭션 처리 라이브러리 -->
<!-- https://mvnrepository.com/artifact/cglib/cglib -->
<dependency>
<groupId>cglib</groupId>
<artifactId>cglib</artifactId>
<version>3.2.4</version>
</dependency>
2. 트랜잭션 관련 설정 추가_1 - mybatis.xml
<!-- 트랜잭션을 걸어줄 대상 DB지정 -->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="datasource"/>
</bean>
<!-- 어떤 방식으로 트랜잭션을 사용할건지 설정 / 우리는 어노테이션 -->
<!-- 트랜잭션이 실행되는 클래스가 인터페이스를 구현받지 않은 클래스일 경우 proxy-target-class는 false를 지정해야함/ 반대의경우 true-->
<tx:annotation-driven proxy-target-class="false"/>
2. 트랜잭션 관련 설정 추가_2 - tx-context.xml
(**web.xml에 설정 변경을 해줬을 경우!!**)
appServlet폴더 - 오른쪽마우스 - new - spring bean configuration file - tx-context.xml - beans랑 tx 에 체크
추가하는 설정내용은 _1 방법과 같음
(+처음엔 서버켜자마자 열리는 root폴더 밑에 넣었는데 이 경우 실행시 안먹히는 걸 알 수 있음 그러면 요청이 왔을 때 불러오는 파일 appServlet폴더 밑에 넣으면 됨 )
3.트랜잭션 필요한 곳에 어노테이션
옵션
* Isolation.DEFAULT : (기본 - 생략 가능) 다른 트랜잭션에서 커밋된 데이터만 읽을 수 있다. 커밋안한 데이터는 읽을 수 없다 / default 이하는 일반적이지 않음
* Isolation.READ_COMMITTED : (기본 - 생략 가능) 다른 트랜잭션에서 커밋된 데이터만 읽을 수 있다.
* Isolation.READ_UNCOMMITTED : 커밋 안한 데이터를 다른 트랜잭션에서 볼 수 있다.
* Isolation.REPEATABLE_READ : 조회중인 데이터를 다른 트랜잭션에서 수정하지 못하도록 막는다. /글을 수정하고 싶은데 누군가 보고있으면 수정을 못한다. _ 보안성이 중요한 문서들
* Isolation.SERIALIZABLE : 한 트랜잭션이 COMMIT 될 때까지 다른 트랜잭션은 CRUD가 불가 //건드리고있으면(?) 작업자체가 안됨
*주의사항*
- Exception 발생 시 트랜잭션이 처리 된다.
- 예외 처리시 try- catch 를 사용하면 rollback이 걸리지 않는다. 그래서 서비스에선 throw를 해서 다른데서 try-catch 해야함
++++++
- dto는 bean이라고도 하고 vo 라고 하기도 함
- controller라는 명칭이 없으면 어노테이션을 찾던가, web을 찾으면 됨
- 컨트롤러가 엄청 많은 경우, 어노테이션 컨트롤러가 많은 경우 일일이 찾는건 비효율 적임
- ->Quick Search [단축키 : ctrl shift L / ctrl shift alt L - 맥북]
03_transaction
'Spring Framework' 카테고리의 다른 글
web.xml 설정 변경, RedirectAttributes, 생성자활용하여 서비스,dao 연결 (0) | 2022.07.11 |
---|---|
Spring_aliase설정 (0) | 2022.07.11 |
Spring_동적쿼리, ModelAndView (0) | 2022.07.10 |
Spring 설정 나누기, 쿼리 로그 설정, dto로 파라메터 받기 (0) | 2022.07.10 |
ajax_페이징 처리 (0) | 2022.06.12 |