AOP와 비슷.
더이상 나눌 수 없는 작업의 단위(Tx).
insert, update, select가 각 하나의 Tx.
계좌 이체의 경우, 출금(update)과 입금(update)이 하나의 Tx로 묶여야 됨.
(출금 --> 돈 --> 입금)계좌이체는 출금과 입금을 하나의 Tx로 묶어야 함.
'모'아니면 '도'.(둘 다 성공 하던가, 하나만 실패해도 취소)(all or nothing)
실패하면 rollback.
원자성(Atomicity) - 나눌 수 없는 하나의 작업으로 다뤄져야 한다.
일관성(Consistency) - Tx 수행 전과 후가 일관된 상태를 유지해야 한다.
고립성(Isolation) - 각 Tx는 독립적으로 수행되어야 한다.
(Isolation Level : 너무 높으면 다른 작업을 하는 사람은 기다려야 하는 상황 발생)
영속성(Durability) - 성공한 Tx의 결과는 유지되어야 한다.(DB)
커밋(commit) - 작업 내용을 DB에 영구적으로 저장
롤백(rollback) - 최근 변경사항을 취소(마지막 커밋으로 복귀)
Auto commit이 기본
자동커밋 - 명령 실행 후, 자동으로 커밋이 수행(rollback 불가)
수동커밋 - 명령 실행 후, 명시적으로 commit또는 rollback을 입력.
SET autocommit =0;
각 Tx을 고립시키는 정도
1. READ UNCOMMITED - 커밋되지 않은 데이터도 읽기 가능(dirty read).
2. READ COMMITED - 커밋된 데이터만 읽기 가능(phantom read).
3. (default) REPEATABLE READ - Tx이 시작된 이후 변경은 무시됨.
4. SERIALIZABLE - 한번에 하나의 Tx만 독립적으로 수행.
(직렬화가 될 수록 성능은 떨어지고, 품질은 높아짐)
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 {
}
}