3-17 Transaction, Commit, Rollback

서현우·2022년 5월 19일
0

스프링의정석

목록 보기
44/85

1. Transaction이란?

AOP와 비슷.
더이상 나눌 수 없는 작업의 단위(Tx).
insert, update, select가 각 하나의 Tx.
계좌 이체의 경우, 출금(update)과 입금(update)이 하나의 Tx로 묶여야 됨.
(출금 --> 돈 --> 입금)계좌이체는 출금과 입금을 하나의 Tx로 묶어야 함.
'모'아니면 '도'.(둘 다 성공 하던가, 하나만 실패해도 취소)(all or nothing)
실패하면 rollback.

2. Transaction의 속성 - ACID

원자성(Atomicity) - 나눌 수 없는 하나의 작업으로 다뤄져야 한다.
일관성(Consistency) - Tx 수행 전과 후가 일관된 상태를 유지해야 한다.
고립성(Isolation) - 각 Tx는 독립적으로 수행되어야 한다.
(Isolation Level : 너무 높으면 다른 작업을 하는 사람은 기다려야 하는 상황 발생)
영속성(Durability) - 성공한 Tx의 결과는 유지되어야 한다.(DB)

3. commit, rollback

커밋(commit) - 작업 내용을 DB에 영구적으로 저장
롤백(rollback) - 최근 변경사항을 취소(마지막 커밋으로 복귀)

4. 자동커밋(Auto commit), 수동커밋

Auto commit이 기본
자동커밋 - 명령 실행 후, 자동으로 커밋이 수행(rollback 불가)
수동커밋 - 명령 실행 후, 명시적으로 commit또는 rollback을 입력.

SET autocommit =0;

5. Tx의 isolation level

각 Tx을 고립시키는 정도
1. READ UNCOMMITED - 커밋되지 않은 데이터도 읽기 가능(dirty read).
2. READ COMMITED - 커밋된 데이터만 읽기 가능(phantom read).
3. (default) REPEATABLE READ - Tx이 시작된 이후 변경은 무시됨.
4. SERIALIZABLE - 한번에 하나의 Tx만 독립적으로 수행.
(직렬화가 될 수록 성능은 떨어지고, 품질은 높아짐)

DBConnectionTest2Test.java

Transaction 테스트

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

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

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

            int rowCnt = pstmt.executeUpdate(); //insert, delete, update

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

            conn.commit();

        } catch (Exception e) {
            conn.rollback();
            e.printStackTrace();
        } finally {

        }
    }
profile
안녕하세요!!

0개의 댓글