본문 바로가기

SPRING

트랜잭션

트랜잭션

두 개 이상의 쿼리가 동작할 때, 한꺼번에 성공하던지, 하나라도 실패하면 다 실패하게!

즉, 살꺼면 같이 살고 죽을꺼면 같이 죽자! 이게 트랜잭션

 

<!-- 커밋, 롤백을 적용해주는 객체 -->
<bean id="transactionManager" 
	class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
	<property name="dataSource" ref="dataSource"/>
</bean>
	
    
<!-- 트랜잭션 관련 어노테이션을 읽어들이는 객체 -->
<tx:annotation-driven transaction-manager="transactionManager"/>

 

import org.springframework.transaction.annotation.Transactional;

public class ChangePasswordService {
	
	private MemberDAO memberDao;
	
	public ChangePasswordService(MemberDAO memberDao) {
		this.memberDao = memberDao;
	}
	
	@Transactional // 트랜잭션이 적용될 메서드
	public void changePassword(String email, String oldPwd, String newPwd) {
		Member member = memberDao.selectByEmail(email);
		
		if(member == null) {
			throw new MemberNotFoundException();
		}
		
		// 트랜잭션 
		// 두 개의 쿼리가 동작함. 두 개의 쿼리문이 하나의 동작처럼 작동하게.
		
		memberDao.update2(member); // 1. 기존 회원의 이름을 변경
		member = memberDao.selectByEmail(member.getEmail()); // 이름이 변경된 회원 정보 가져옴
		member.changePassword(oldPwd, newPwd); // 2. 가져온 회원의 비밀번호 변경
		memberDao.update(member); // 데이터베이스에 변경된 정보를 반영
	}

}