meong_j
기록하는 습관.
meong_j
전체 방문자
오늘
어제
  • 분류 전체보기 (176)
    • 개인 공부 정리 (0)
    • 서버 운영 (37)
      • Linux (36)
    • Frontend (11)
      • Vue.js (10)
    • Backend (70)
      • Java (4)
      • Python (22)
      • Django (38)
      • Spring (6)
    • Database (5)
      • Oracle (4)
      • MySQL (1)
      • MariaDB (0)
    • Android (14)
      • Kotlin (6)
    • 배포 (9)
      • Docker (8)
      • AWS (1)
    • IT_study (29)
      • Coding test (17)
      • 알고리즘 (5)
      • 스터디 (6)

블로그 메뉴

  • 홈
  • 태그
  • 방명록
  • github

인기 글

반응형

태그

  • SASS Variables
  • 배포인프라
  • 개발자도서
  • django
  • cpu사용률
  • Kotlin
  • gabagecollecter
  • dp #알고리즘
  • 테크커리어
  • 이차원배열정렬
  • 리눅스인증
  • DHCP
  • 리눅스방화벽
  • 코틀린자료형
  • docker
  • dockersecret
  • router-link
  • 중첩라우트
  • Proxy
  • 안드로이드adaptor

최근 댓글

최근 글

250x250
hELLO · Designed By 정상우.
meong_j

기록하는 습관.

Backend/Spring

[Spring] JDBC 기반 트랜잭션(Transaction) 관리자 -DataSourceTransactionManager

2021. 10. 27. 14:57
728x90
반응형

📌트랜잭션(Transaction)

트랜잭션(Transaction)이란 하나의 작업을 수행하기 위해 데이터베이스에서 논리적인 작업의 단위 또는 한번에 모두 수행되어야 하는 일련의 연산을 말한다.  

1. 사용자가 시스템에 대한 서비스 요구 시 시스템이 응답하기 위한 상태 변화 과정의 작업 단위이다.
2. 하나의 트랜잭션은 commit 과 rollback 명령어를 사용한다.
- 커밋(commit) : 변경 사항을 DB에 정상적으로 반영한다, 반영 완료
- 롤백(rollback) : 작업 실패 시 트랜잭션 실행 전 상태로 되돌린다, 작업 취소

 

📌 트랜잭션의 특징 (ACID)

1. Atomicity(원자성) : 트랜잭션 구성하는 연산들은 모두 정상 실행되거나 모두 실행되지 않아야 함
2. Consistency(일관성) : 트랜잭션 수행 전 일관된 데이터베이스와 트랜잭션 수행 후 결과도 일관성 있는 상태를 유지해야 함
3. Isolation(격리성) : 수행 중인 트랜잭션이 완료될 때 까지 다른 트랜잭션이 접근 할 수 없음
4. Durability(지속성) : 시스템 장애 발생 하더라도 데이터베이스에 그대로 남아있어야 함

 

 

📌 트랜잭션 관리자(Transaction Manager)

TM은 트랜잭션이 완료 될 때까지 트랜잭션 상태를 유지하는 역할을 한다.

여러 작업이 동시에 실행되고 있을때, 만약 2개의 작업 중 1개의 작업이 에러 발생시 이 트랜잭션은 중지가 되고 트랜잭션들이 충돌없이 잘 이루어지도록 관리해준다. 이러한 트랜잭션 관리자를 Spring framework에서도 구현할 수 있다.

 

DataSourceTransactionManager

스프링에서 JDBC 및 mybatis 등의 JDBC 기반 라이브러리로 데이터베이스로 접근하는 경우 사용하는 인터페이스이다.

xml 파일 설정

<bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
		<property name="dataSource" ref="dataSource"/>
</bean>

<tx:advice id="txAdvice" transaction-manager="txManager">
	<tx:attributes>
		<tx:method name="*" timeout="60" rollback-for="Exception"/>
	</tx:attributes>
</tx:advice>

<aop:config>
	<aop:pointcut id="requiredTx" expression="execution(* com.springproject.webadmin..impl.*Impl.*(..))"/>
	<aop:advisor advice-ref="txAdvice" pointcut-ref="requiredTx" />
</aop:config>
  • DataSourceTransactionManager를 사용하기 위해 bean 객체로 설정한다.
  • 트랜잭션 제한시간 timeout=60초 발생시 rollback으로 예외 처리한다.
  • aop Aspect 앨리먼트로 등록하여 txAdvice로 등록한 어드바이스가 동작하여 트랜잭션을 관리하도록 설정한다.
  • 포인트 컷에 Advice를 적용할 메소드들을 execution 명시자에 등록한다.
  • 여러개의 db를 사용하는 경우 서로 다른 id의 bean을 여러 개 등록하면 된다.

 

클래스(class)와 메소드(method) 추가

	@Resource(name = "txManager")
	private DataSourceTransactionManager transactionManager;
  • bean 설정한 트랜잭션 id로 DataSourceTransactionManager 클래스를 어노테이션한다.

 

DefaultTransactionDefinition td = new DefaultTransactionDefinition(TransactionDefinition.PROPAGATION_REQUIRED);
td.setIsolationLevel(TransactionDefinition.ISOLATION_READ_COMMITTED);
td.setTimeout(60);
TransactionStatus status = transactionManager.getTransaction(td);
  • DefaultTransactionDefinition 객체를 통해 트랜잭션에 관한 속성을 전달한다.
PROPAGATION_REQUIRED : 진행 중인 트랜잭션이 없으면 새로 시작하고, 이미 시작된 트랜잭션이 있으면 참여함
PROPAGATION_REQUIRES_NEW : 항상 새로운 트랜잭션을 시작하며 독립된 트랜잭션을 실행함
PROPAGATION_NOT_SUPPORTED : 트랜잭션 없이 동작하도록 , 진행중인 트랜잭션 무시함
  • ISOLATION_READ_COMMITTED (default)로 트랜잭션 격리 레벨을 설정하여 다른 트랜잭션에 의해 commit되지 않은 데이터는 다른 트랜잭션에서 볼수 없도록 한다
  • TransactionStatus는 트랜잭션 실행을 제어하고 상태를 조회하는 방법을 제공한다.

 

transactionManager.commit(status);
transactionManager.rollback(status);
  • transactionManager.commit(status) : 성공적이면 트랜잭션에서 commit 한다
  • transactionManager.rollback(status) : 실패하면 트랜잭션에서 rollback  한다.
반응형
저작자표시 비영리 변경금지 (새창열림)

'Backend > Spring' 카테고리의 다른 글

[log4j2, Logback] 로깅 라이브러리  (0) 2022.07.31
[Spring Error] java.lang.IllegalArgumentException: Invalid character found in the request target. The valid characters are defined in RFC 7230 and RFC 3986 인코딩 에러 해결  (0) 2021.11.01
[tomcat] 에러 org.apache.catalina.LifecycleException, java.lang.ClassNotFoundException 해결방법  (1) 2021.11.01
[Spring] 스프링 프로젝트에서 빨간줄 뜰때 해결법  (0) 2021.10.28
[mybatis 에러] org.apache.ibatis.binding.BindingException 에러 원인  (2) 2021.10.25
    'Backend/Spring' 카테고리의 다른 글
    • [Spring Error] java.lang.IllegalArgumentException: Invalid character found in the request target. The valid characters are defined in RFC 7230 and RFC 3986 인코딩 에러 해결
    • [tomcat] 에러 org.apache.catalina.LifecycleException, java.lang.ClassNotFoundException 해결방법
    • [Spring] 스프링 프로젝트에서 빨간줄 뜰때 해결법
    • [mybatis 에러] org.apache.ibatis.binding.BindingException 에러 원인
    meong_j
    meong_j
    #it #개발일기 #개발공부 #개발자 #백앤드 #생각정리 #시간은 실력에 비례한다 #뭐든지 꾸준히 열심히 #오늘의 내가 내일의 나를 만든다

    티스토리툴바