Spring - Transaction [IT 국비지원/구디 아카데미/김지훈 강사님]

hooon__dii·2023년 9월 18일
0

Spring

목록 보기
3/5
post-thumbnail

Transaction

Transaction은 Data Base에서 사용되는 쪼갤 수 없는 업무처리의 단위이다.
실생활에서 하나 이상의 동작이지만 분리해서 실행 할 수 없는 상황에는 무엇이 있을까

// transaction 사용 예시

// HomeDAO

	public void insert() throws SQLException {
		// 1. 정상적인 insert문
		// 2. 잘못된 insert문
        // 3. 결과 : 잘못된 insert문에서 예외 발생시 정상적인 insert문도 취소
		
		String sql = "INSERT INTO member(id, pw, name, age, gender, email) VALUES(?, ?, ?, ?, ?, ?)";
		
		// 같은 쿼리를 두번 날릴때 두번째는 PK 중복으로 예외가 발생한다.
		// 트랜잭션을 적용하면 첫번째 쿼리문도 취소 되어야 한다.
		pstmt = conn.prepareStatement(sql);
		pstmt.setString(1, "tx_manager");
		pstmt.setString(2, "1234");
		pstmt.setString(3, "관리자");
		pstmt.setInt(4, 20);
		pstmt.setString(5, "남자");
		pstmt.setString(6, "tranx@email.com");
		
		int row =  pstmt.executeUpdate();
		logger.info("SQL 1 = "+row);
		
//		java.sql.SQLSyntaxErrorException: (conn=9) You have an error in your SQL syntax; 
//		check the manual that corresponds to your MariaDB server version for the right syntax to use near '?, ?, ?, ?, ?, ?)' at line 1
		
		row = pstmt.executeUpdate(sql);
		logger.info("SQL 2 = "+row);
		
	}
    
 // HomeService
 public class HomeService {
	Logger logger = LoggerFactory.getLogger(this.getClass());
	HomeDAO dao = null;
	public boolean connect() {
		logger.info("DAO에 DB접속 요청");
		dao = new HomeDAO();
		
		// dao 객체의 conn변수에 어떻게 접근하나?
		boolean success = dao.conn == null ? false : true;
		
		if(success) {
			try {
				// transaction은 한 method에서 동시 실행되는 쿼리가 있을 경우 사용한다. (일반적으로)
				// 여러 method가 있다고 하더라도 , 모두 select문이라면 사용할 필요가 없다. ( 데이터가 변하지 않으니 )
				
				dao.conn.setAutoCommit(false);	// auto commit 기능 끄기
				dao.insert();
				dao.conn.commit();	// 확정
			} catch (Exception e) {
				e.printStackTrace();
				try {
					dao.conn.rollback();	// 예외가 발생하면 되돌리기
				} catch (SQLException e1) {
					e1.printStackTrace();
				}
			}
		}
		
		dao.close();
		return success;
	}

0개의 댓글