3. Back-end/3-2. Spring MVC - 남궁성

Spring MVC - [ Transaction, commit, Rollback ]

yunyj99 2023. 3. 3. 14:54

1. Transaction

Transaction (=Tx) 이란 더 이상 나눌 수 없는 작업의 단위를 의미한다. (ex. insert, update, select문 각각 하나하나 / 계좌 이체(출금+입금) 등)

계좌 이체의 경우는 출금과 입금이 하나의 Tx여야 한다. (계좌 이체 시 출금이 이루어지면 입금도 반드시 이루어져야하므로!)

 

 

Transaction의 속성은 크게 ACID 4가지로 볼 수 있다.

  1. 원자성(Atomicity) : 나눌 수 없는 하나의 작업으로 다뤄져야 한다.
  2. 일관성(Consistency) : Tx 수행 전과 후가 일관된 상태를 유지해야 한다. 
  3. 고립성(Isolation) : 각 Tx는 독립적으로 수행되어야 한다.
  4. 영속성(Durability) : 성공한 Tx의 결과는 유지되어야 한다.

 

Tx을 고립시키는 정도에 따라 Isolation level을 네 가지로 나눠보면 다음과 같다.

  1. READ UNCOMMITED : 커밋되지 않은 데이터도 읽기 가능
  2. READ COMMITED : 커밋된 데이터만 읽기 가능
  3. (Default) REPEATABLE READ - Tx의 시작 후 다른 Tx의 변경은 무시됨 
  4. SERIALIZABLE : 한 번에 하나의 Tx만 독립적으로 수행 (=실행 중인 Tx 종료될 때 까지 다음 Tx는 대기. but 읽기 중에 읽기는 가능. 읽기 중에 쓰기나 쓰기 중에 읽기는 불가능) (고립도 가장 높음)

 

 

 

참고로 인텔리제이에서 Query Console에서 상단의 Tx:Manual 클릭하면 Isolation level 설정 가능

 

 

 


2. Commit과 Rollback

작업 내용을 DB에 영구적으로 저장하기 위해서는 커밋을 해야 하고, 롤백을 통해 최근 변경사항을 취소(=마지막 커밋으로 복귀. 앞의 커밋으로는 이동 불가)할 수 있다.

 

커밋은 자동 또는 수동으로 설정할 수 있다. 자동 커밋의 경우 명령 실행 후 자동으로 커밋이 수행되어 Rollback이 불가하다. 수동 커밋은 명령 실행 후 명시적으로 commit 또는 rollback을 입력 해야한다.

 

 

 

 

 


다음과 같이 사용할 수 있다.

1.  sql 실행 전에 autocommit을 false로 설정 후,

2. 실행이 완료 되면 마지막에 commit 해주도록 한다.

3. catch문에는 rollback을 넣어서 오류 발생 시 실행 전 상황으로 되돌릴 수 있도록 한다.

 @Test
    public void transactionTest() throws Exception {
        Connection conn = null;
        try {
            deleteAll();
            conn = ds.getConnection();
            // autoCommit false로 실행
            conn.setAutoCommit(false);

            String sql = " insert into user_info values (?,?,?,?,?,?,now())";

            PreparedStatement pstmt = conn.prepareStatement(sql); // SQL Injection 공격, 성능향상
            pstmt.setString(1, "asdf");
            pstmt.setString(2, "123");
            pstmt.setString(3, "kbs");
            pstmt.setString(4, "aa@aa.com");
            pstmt.setDate(5, new java.sql.Date(new Date().getTime()));
            pstmt.setString(6, "fb");

            int rowCnt = pstmt.executeUpdate();

            pstmt.setString(1, "asdf");
            rowCnt = pstmt.executeUpdate();

            // 실행 잘 되면 commit
            conn.commit();
        } catch (Exception e) {
            // 중간에 문제 생길 경우 다시 처음으로 rollback 시킴
            conn.rollback();
            e.printStackTrace();
        } finally {
        }

    }

 

 


참조

https://fastcampus.co.kr/dev_academy_nks

 

스프링의 정석 : 남궁성과 끝까지 간다 | 패스트캠퍼스

국비지원 조기 마감 신화, 베스트셀러 'JAVA의 정석'의 저자 남궁성의 Spring 강의입니다! 오픈톡방과 카페에서 평생 AS를 제공하며 완강과 취업까지 도와드립니다. 지금 할인가로 확인하세요!

fastcampus.co.kr