티스토리 뷰

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>

 

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/01   »
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
글 보관함