Notice
Recent Posts
Recent Comments
Link
«   2025/05   »
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
Tags
more
Archives
Today
Total
관리 메뉴

Today I Learned

Spring_transaction 본문

Spring Framework

Spring_transaction

꾸주니12 2022. 7. 11. 12:19

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