SPRING - 스프링 트랜잭션(2)

이번 포스팅은 이전 포스팅에 이어서

트랜잭션 rollback 기능을 추가해보겠습니다


먼저 servlet-context.xml에

트랜잭션매니저 빈을 생성해야합니다


1
2
3
<beans:bean name="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <beans:property name="dataSource" ref="dataSource" />
</beans:bean>
cs

다음 DAO에서 트랜잭션 처리를 하는

플랫폼트랜잭션매니저 인터페이스를 생성합니다


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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
package com.spring.ex.dao;
 
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
 
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.PreparedStatementCreator;
import org.springframework.transaction.PlatformTransactionManager;
import org.springframework.transaction.TransactionDefinition;
import org.springframework.transaction.TransactionStatus;
import org.springframework.transaction.support.DefaultTransactionDefinition;
 
import com.spring.ex.dto.TicketDto;
 
public class TicketDao {
 
    JdbcTemplate template;
    
    PlatformTransactionManager transactionManager;
    
    @Autowired
    public void setTemplate(JdbcTemplate template) {
        this.template = template;
    }
    
    public void setTransactionManager( PlatformTransactionManager transactionManager) {
        this.transactionManager = transactionManager;
    }
    
    public TicketDao() {
        System.out.println(template);
    }
    
    public void buyTicket(final TicketDto dto) {
        System.out.println("buyTicket()");
        System.out.println("dto.getConsumerId() : " + dto.getConsumerId());
        System.out.println("dto.getAmount() : " + dto.getAmount());
        
        TransactionDefinition definition = new DefaultTransactionDefinition();
        TransactionStatus status = transactionManager.getTransaction(definition);
        
                
        try{
        template.update(new PreparedStatementCreator() {
            
            @Override
            public PreparedStatement createPreparedStatement(Connection con)
                    throws SQLException {
                String query = "insert into card (consumerId, amount) values (?, ?)";
                PreparedStatement pstmt = con.prepareStatement(query);
                pstmt.setString(1, dto.getConsumerId());
                pstmt.setString(2, dto.getAmount());
                
                return pstmt;
            }
        });
        
        template.update(new PreparedStatementCreator() {
            
            @Override
            public PreparedStatement createPreparedStatement(Connection con)
                    throws SQLException {
                String query = "insert into ticket (consumerId, countnum) values (?, ?)";
                PreparedStatement pstmt = con.prepareStatement(query);
                pstmt.setString(1, dto.getConsumerId());
                pstmt.setString(2, dto.getAmount());
                
                return pstmt;
            }
        });
        transactionManager.commit(status);
        
    }catch(Exception e) {
        e.printStackTrace();
        
        transactionManager.rollback(status);
        
      }
    }
    
}
 
cs


21line에 플랫폼 트랜잭션 매니저는 인터페이스로

하위로 많은 클래스들이 존재합니다.

28line 에서 트랜잭션매너지 setter을 만든이유는

스프링 설정 파일(servlet-context)에서 트랜잭션 객체를 모두

빈으로 할당 해주기 위해 만들어줍니다.


사용 방법은 간단합니다.

41,42line 에서 두 개의 객체를 생성합니다

41line 객체는 트랜잭션을 구동하는데 기본적으로

필요한 객체입니다 

42line 에서는 기본적으로 필요한 설정값들을

41line에서 만든 객체에서 꺼내서 status에 넣어줍니다


다음 45line 처럼 트랜잭션을 할 부분에 try ~catch문으로 감쌉니다

다음 73line에서 문제없이 실행이 되었다면 트랜잭션매니저에서

커밋을 해주고 그안에 status 넣어줍니다


다음 에러가 걸렸다면 catch문이 실행되며 트랜잭션매니저가

rollback을 수행합니다


이제 jsp파일을 실행 시켜봅니다






위와같이 ccc라는 아이디로 4장의 티켓을

구매하면 정상적으로 결제, 발권이 되는 것을

확인 할 수 있습니다.


이제 5장이상의 티켓을 구매해 보겠습니다.





5장 이상 구매시 콘솔창에 제약조건에 위배되었다는 

문구를 확인할수 있습니다.





에러발생후 롤백 처리에 의해

결제, 발권 모두 취소 처리 되어

DB에 값이 없는걸 확인 할 수 있습니다.


다음 포스팅엔 좀더 편하게 쓸수 있는

트랜잭션에 대해 알아보겠습니다.



'SPRING' 카테고리의 다른 글

SPRING - Mybatis 사용하기(1)  (0) 2018.02.13
SPRING - 스프링 트랜잭션(3)  (0) 2018.02.08
SPRING - 스프링 트랜잭션(1)  (0) 2018.02.08
SPRING - 스프링JDBC, @Autowired  (0) 2018.02.08
SPRING - @Valid 와 @InitBinder  (0) 2018.02.07

댓글

Designed by JB FACTORY