2019. 7. 19. 09:11ㆍSpring
---------------------------트랜잭션 중요!!-------------------------
트랜잭션
- 여러 번의 SQL 명령을 하나의 논리적인 작업그룹으로 정하는 것
- 대상 SQL 명령은 INSERT, UPDATE, DELETE가 해당된다.
- 예
- 게시판 글쓰기
- SELECT - 사용자가 해당 서비스에 글쓰기 권한을 가졌는지 조회
- INSERT - 작성한 글을 테이블에 저장
- UPDATE - 사용자의 포인트를 10 증가시키기
- UPDATE - 사용자의 등급을 변경하기
* 위의 작업에서 SQL 명령이 실행될 때마다 즉시 데이터베이스에 반영하면 <--Auto Commit
부분적인 성공이 발생할 가능성이 있다.
- 글이 데이터베이스에 저장됐지만, 포인트가 증가되지 않는 상황
- 글도 저장되고, 포인트도 증가됐지만, 등급이 변경되지 않는 상황
// JDBC 기술 사용시
public void addBoiard(Board board) {
try {
Connection con = getConnection();
con.setAutoCommit(false); <--- 자동 커밋기능 비활성화 시킴
// SELECT
// INSERT
// UPDATE
// DELETE
con.commit(); <--- 모든 SQL 명령이 정상 실행되면 DB 반영
} catch (Exception e) {
con.rollback(); <--- SQL 명령 실행 중 에러가 발생하면 DB 반영 전부 취소
}
}
// hibernate 기술 사용시
public void addBoard(Board board){
try {
Session session = sessionFactory.openSession();
Transaction tx = session.beginTransaction();
seesion.persist(board);
session.commit();
} catch (Exception e) {
session.rollback();
}
}
스프링의 트랜잭션 처리
- DB Access 기술과 무관하게 모든 트랜잭션매니저가 구현할 기능을 정의한
PlatformTransactionManager 인터페이스를 만들었다.
- 주요 메소드
TransactionStatus getTransaction(TransactionDefinition definition)
void commit(TransactionStatus status)
void rollback(TransactioinStatus status)
- 각각의 DB Access기술에 적합하게 PlatformTransactionManager를 구현한 구현클래스를 제공한다.
- 주요 기술별 트랜잭션 매니저
주요기술 트랜잭션매니저
--------------------------------------------------------
Spring JDBC DataSourceTransactionManager
ibatis DataSourceTransactionManager
mybatis DataSourceTransactionManager
JPA JpaTransactionManager
Hibernate HibernateTransactionManager
JTA JtaTransactionManager
--------------------------------------------------------
- 스프링에서의 트랜잭션 처리 방법
- 선언적 트랜잭션처리 (Declarative Transaction Management)
- 코드에서 직접 트랜잭션을 처리하지 않고, 선언적으로 트랜잭션을 관리하는 것
- @Transactional 어노테이션을 활용한다.
- 적용 예)
빈 설정 파일
<bean id="tracsactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">"
</bean>
<tx:annotation-driven transaction-manager="transactionManager" />
코드
@Transactional
public interface xxxService {
void order(Order order);
List getOrders(String userId);
}
@Service
public class xxxServiceImpl implements xxxService {
@AutoWired Dao1 dao1;
@AutoWired Dao2 dao2;
@AutoWired Dao3 dao3;
public void order(Order order){
dao1.insertxxx();
...
}
}
* xxxService의 모든 구현 메소드가 실행될 때마다 트랜잭션처리가 수행된다.
- XML 설정을 이용한 선언적 트랜잭션처리 (이러면 @Transactional도 안써도된다.)
- 적용 예)
빈 설정
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"></property>
</bean>
<tx:annotation-driven transaction-manager="transactionManager"/>
<!-- AOP 설정을 이용한 선언적 트랜잭션 처리-->
<tx:advice id="txAdvice" transaction-manager="transactionManager"></tx:advice>
<aop:config>
<aop:advisor advice-ref="txAdvice" pointcut="within(com.sample.aop.service.*serviceImpl)"/>
</aop:config>
- 프로그래매틱 트랜잭션처리 (Programmactic Transaction Management)
- 프로그램에서 직접 트랜잭션을 관리하고자 할 때 사용하는 방법
- 실제 프로젝트에서 거의 사용되지 않음