트랜잭션
트랜잭션 개념
사용방법
제약조건이 안 결려 있으면, 카드 결제는 되는데, 매표소에서는 제약조건이 걸려 있어서 테이블에 기입이 안됨.
그래서 한 쪽에서 튕기면 한쪽에서도 취소가 되도록 해야 함
트랜잭션 처리가 되면 카드결제에 남아있는 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문 끝나면서 그 결과가 반환됨