티스토리 뷰
transaction 처리
-
auto commit을 해제 -> 트랜잭션의 시작
-
state의 기본값을 false로 지정, try 문이 정상 실행 되면 state값을 true로 변경
-
state에 따라서 commit 할지 rollback할지 결정
< TransactionBasicTest.java >
package transaction;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;
public class TransactionBasicTest {
public static void main(String[] args) {
String url = "jdbc:oracle:thin:@127.0.0.1:1521:xe";
String user = "encore";
String password = "encore";
String sql ="";
Connection con =null;
PreparedStatement ptmt =null;
// 현재 상태 값을 저장할 boolean변수 선언
// 정상완료 state는 true, 비정상완료 state는 false
boolean state = false;
try{
Class.forName("oracle.jdbc.driver.OracleDriver");
con = DriverManager.getConnection(url, user, password);
// java program안에서 auto commit을 해제 - 수동설정
// 트랜잭션의 시작으로 인식
con.setAutoCommit(false);
sql = "insert into emp values('4444','1111','111','111',sysdate,'1111',1000,'1111')";
ptmt = con.prepareStatement(sql);
ptmt.executeUpdate();
sql = "insert into emp values('5555','2222','2222','2222',sysdate,'2222',1000,'2222')";
ptmt = con.prepareStatement(sql);
ptmt.executeUpdate();
sql = "insert into emp values('6666','3333','3333','3333',sysdate,'3333',1000,'3333')";
ptmt = con.prepareStatement(sql);
ptmt.executeUpdate();
state = true;
}catch(ClassNotFoundException e){
}catch(SQLException e){
e.printStackTrace();
}finally{
// state 값에 따라서 정상처리 or 비정상처리 실행
try {
if(state) {
con.commit(); // db의 모든 작업을 commit한다.
} else {
con.rollback(); // db의 모든 작업을 취소한다.
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
-
오류없이 실행 되었을 경우 결과
-
잘못된 sql을 삽입하여 오류를 발생시킨 후 결과
sql = "insert into emp values('4444','1111','111','111',sysdate,'1111',1000,'1111')";
ptmt = con.prepareStatement(sql);
ptmt.executeUpdate();
sql = "insert into emp values('5555','2222','2222','2222',sysdate,'2222',1000,'2222')";
ptmt = con.prepareStatement(sql);
ptmt.executeUpdate();
sql = "insert into emp values('6666','3333','3333','3333',sysdate,'3333',1000,'3333'"; //괄호제거
-
결과 - 오류발생으로 모두 insert되지 않음
AOP를 이용한 transaction 처리
-
AOP를 이용하여 transaction처리를 쉽게 할 수 있다.
-
spring 설정 추가
<!-- =========aop를 이용한 선언적 트랜잭션의 처리============== -->
<!-- 1. 트랜잭션 처리를 위해 제공하는 spring클래스를 등록 -->
<beans:bean id="transactionManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<beans:property name="dataSource" ref="ds"/>
</beans:bean>
<!-- 2. 1번에서 등록한 트랜잭션 처리 클래스를 advice로 등록 -->
<tx:advice id="transactionAdvice"
transaction-manager="transactionManager">
<tx:attributes>
<!-- exception이 발생하면 rollback -->
<tx:method name="insert" rollback-for="Exception"/>
</tx:attributes>
</tx:advice>
<!-- 3. aop처리 -->
<aop:config>
<aop:pointcut expression="execution(* kr.encore.bigdataShop.board.BoardServiceImpl.insert(..))"
id="txpointcut"/>
<aop:advisor advice-ref="transactionAdvice" pointcut-ref="txpointcut"/>
</aop:config>
'Spring' 카테고리의 다른 글
Gradle-Spring Project #2 - 정적 컨텐츠, MVC-템플릿, API (0) | 2020.10.04 |
---|---|
Gradle-Spring Project #1 - 프로젝트 환경설정 (0) | 2020.10.04 |
Maven - Spring Project : AOP (0) | 2020.10.01 |
Maven - Spring Project : Ajax 사용하기 (0) | 2020.10.01 |
Maven - Spring Project : Mybatis 연동 (0) | 2020.09.27 |
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- RAID Architecture
- springboot
- 빅데이터 플랫폼
- jdbc
- 빅데이터
- JSON
- Java
- vmware
- SPARK
- Replacement Strategies
- I/O Services of OS
- File Protection
- Free space management
- I/O Mechanisms
- hadoop
- Variable allocation
- SQL
- HDFS
- gradle
- Allocation methods
- aop
- mapreduce
- oracle
- Disk Scheduling
- Spring
- 하둡
- Disk System
- Flume
- linux
- maven
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
글 보관함