1. Transaction
Transaction (=Tx) 이란 더 이상 나눌 수 없는 작업의 단위를 의미한다. (ex. insert, update, select문 각각 하나하나 / 계좌 이체(출금+입금) 등)
계좌 이체의 경우는 출금과 입금이 하나의 Tx여야 한다. (계좌 이체 시 출금이 이루어지면 입금도 반드시 이루어져야하므로!)
Transaction의 속성은 크게 ACID 4가지로 볼 수 있다.
- 원자성(Atomicity) : 나눌 수 없는 하나의 작업으로 다뤄져야 한다.
- 일관성(Consistency) : Tx 수행 전과 후가 일관된 상태를 유지해야 한다.
- 고립성(Isolation) : 각 Tx는 독립적으로 수행되어야 한다.
- 영속성(Durability) : 성공한 Tx의 결과는 유지되어야 한다.
각 Tx을 고립시키는 정도에 따라 Isolation level을 네 가지로 나눠보면 다음과 같다.
- READ UNCOMMITED : 커밋되지 않은 데이터도 읽기 가능
- READ COMMITED : 커밋된 데이터만 읽기 가능
- (Default) REPEATABLE READ - Tx의 시작 후 다른 Tx의 변경은 무시됨
- 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
'3. Back-end > 3-2. Spring MVC - 남궁성' 카테고리의 다른 글
Spring MVC - [ 서비스 계층의 분리 / Transactional ] (0) | 2023.03.17 |
---|---|
Spring MVC - [ AOP ] (0) | 2023.03.09 |
Spring MVC - [ Spring DI ] (0) | 2023.02.08 |
Spring MVC - [ 데이터의 검증 ] (0) | 2023.02.02 |
Spring MVC - [ 데이터의 변환 ] (0) | 2023.02.02 |