수풀속의고라니 2022. 5. 23. 17:26
728x90

트랜잭션 개념

 

 

사용방법

 

 

제약조건이 안 결려 있으면, 카드 결제는 되는데, 매표소에서는 제약조건이 걸려 있어서 테이블에 기입이 안됨.

그래서 한 쪽에서 튕기면 한쪽에서도 취소가 되도록 해야 함

트랜잭션 처리가 되면 카드결제에 남아있는 5개의 데이터도 삭제가 됨

 

 

스프링 트랜잭션 사용하기 위한 설정

 

*. servlet-context.xml

<beans:bean name="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<beans:property name="driverClassName" value="oracle.jdbc.driver.OracleDriver"></beans:property>
<beans:property name="url" value="jdbc:oracle:thin:@localhost:1521:xe"></beans:property>
<beans:property name="username" value="scott"></beans:property>
<beans:property name="password" value="tiger"></beans:property>
</beans:bean>

<beans:bean class="org.springframework.jdbc.core.JdbcTemplate" name="template">
<beans:property name="dataSource" ref="dataSource"></beans:property>
</beans:bean>

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

<beans:bean name="dao" class="com.javalec.spring_tran_apply.dao.TicketDao">
<beans:property name="template" ref="template"></beans:property>
<beans:property name="transactionManager" ref="transactionManager"></beans:property>
</beans:bean>

 

----

 

*. Dao

PlatformTransactionManager transactionManager;

public void setTransactionManager(PlatformTransactionManager transactionManager) {

this.transactionManager = transactionManager;

}

public void buyTicket(final TicketDto dto) {

TransactionDefinition definition = new DefaultTransactionDefinition();

TransactionStatus status = transactionManager.getTransaction(definition);

try {

template.update(new PreparedStatementCreator() {

}

});

template.update(new PreparedStatementCreator() {

}

});

transactionManager.commit(status);

} catch (Exception e) {

transactionManager.rollback(status);

}

 

예제

테이블

 

 

pom.xml, 스프링 설정 파일에는 template 꺼만 가져옴

 

dto

 

 

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
public class TicketDao {
 
    JdbcTemplate template;
    PlatformTransactionManager transactionManager;
 
    public void setTransactionManager(PlatformTransactionManager transactionManager) {
        this.transactionManager = transactionManager;
    }
 
    public void setTemplate(JdbcTemplate template) {
        this.template = template;
    }
 
    public void buyTicket(final TicketDto dto) {
        TransactionDefinition definition = new DefaultTransactionDefinition();
        //이걸 가지고 commit과 rollback에 사용
        TransactionStatus status = transactionManager.getTransaction(definition);
        
        try {
            template.update(new PreparedStatementCreator() {
                
                @Override
                public PreparedStatement createPreparedStatement(Connection con) throws SQLException {
                    String sql = "insert into card(consumerId, amount) values(?,?)";
                    PreparedStatement pstmt = con.prepareStatement(sql);
                    pstmt.setString(1, dto.getConsumerId());
                    pstmt.setInt(2, dto.getAmount());
                    return pstmt;
                }
            });
            
            template.update(new PreparedStatementCreator() {
                
                @Override
                public PreparedStatement createPreparedStatement(Connection con) throws SQLException {
                    String sql = "insert into ticket(consumerId, countnum) values(?,?)";
                    PreparedStatement pstmt = con.prepareStatement(sql);
                    pstmt.setString(1, dto.getConsumerId());
                    pstmt.setInt(2, dto.getAmount());
                    return pstmt;
                }
            });
            //제약 조건 걸리지 않고 예외 발생 안하면 그냥 커밋
            transactionManager.commit(status);
        } catch (Exception e) {
            e.printStackTrace();
            //제약 조건에 걸려서 예외 발생하면 여기서 예외처리
            transactionManager.rollback(status);
        }
    }
}
cs

 

controller

 

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
@Controller
public class HomeController {
    
    private TicketDao dao;
    
    @Autowired    
    public HomeController(TicketDao dao) {
        this.dao = dao;
    }
 
    private static final Logger logger = LoggerFactory.getLogger(HomeController.class);
    
    /**
     * Simply selects the home view to render by returning its name.
     */
    @RequestMapping(value = "/", method = RequestMethod.GET)
    public String home(Locale locale, Model model) {
        logger.info("Welcome home! The client locale is {}.", locale);
        
        Date date = new Date();
        DateFormat dateFormat = DateFormat.getDateTimeInstance(DateFormat.LONG, DateFormat.LONG, locale);
        
        String formattedDate = dateFormat.format(date);
        
        model.addAttribute("serverTime", formattedDate );
        
        return "redirect:buy_ticket";
    }
    
    @RequestMapping("/buy_ticket")
    public String buy_ticket() {
        return "buy_ticket";
    }
    
    @RequestMapping("/buy_ticket_card")
    public String buy_ticket_card(TicketDto ticketDto, Model model) {
        dao.buyTicket(ticketDto);
        model.addAttribute("ticketInfo", ticketDto);
        
        return "buy_ticket_end";
    }
}
cs

 

마이바티스 쓸 때는 위의 내용을 serviceImple에서 처럼 사용하면됨

 

 

이 부분을 serviceImpl에 넣고, template.~ 부분을 앞에서 한거처럼 하는데, dao.buyTicket을 2번 씀

그럼 dao.xml에서 값을 반환하고 try문 끝나면서 그 결과가 반환됨

728x90