트랜잭션(transaction)이란 단일한 논리 작업 단위이며
논리적인 이유로 여러 SQL문들을 단일 작업으로 묶어서 나눠질 수 없게 만든 것입니다.
일부만 성공하면 DB에 반영되지 않습니다.
예를 들어, A가 B에게 1만원을 입금하는 경우
A계좌에서 돈을 꺼내고 B계좌에 돈을 입금하는 과정은 단일 과정으로 한번에 모두 수행되어야 합니다.
start transaction; //autocommit off update account set balance = balance - 10000 where id = "A"; //A계좌에서 출금 update account set balance = balance + 10000 where id = "B"; //B계좌에 입금 commit; //저장
commit
지금까지 작업한 내용을 DB에 영구적으로 저장해줍니다.
transaction 종료
start transaction; update account set balance = balance - 10000 where id = "A"; rollback;
rollback
지금까지 작업을 모두 취소하고 transaction 이전 상태로 되돌립니다.
transaction 종료
AUTOCOMMIT
성공하면 자동으로 commit
실패하면 자동으로 rollbackstart transaction 시 autocommit은 자동으로 꺼지며 종료되면 켜지게 됩니다.
public void transfer(String fromId, String told, int amount){ try{ Connection con = ''; con.setAutoCommit(false); .. // 실제 로직이 수행되는 공간 .. con.commit(); }catch(Exception e){ ... con.rollback() }finally{ con.setAutoCommit(true); } }
@Transactional public void transfer(String fromId, String told, int amount){ .. //실제 로직이 수행되는 공간 .. }
DB 서버에서 connection을 가져오고 트랜잭션을 수행하는 모든 과정을
@Transactional 어노테이션이 모두 대체해줍니다.
All or Nothing
트랜잭션의 연산은 데이터베이스에 모두 반영되거나, 아무것도 반영되지 않아야 합니다.
transaction은 논리적으로 쪼갤 수 없는 작업 단위이기 때문에 내부의 SQL문이 모두 성공해야 하고 중간에 SQL문이 실패하면 모두 rollback해주게 됩니다.
데이터베이스의 일관성을 유지해줍니다.
transaction은 DB상태를 consistent 상태에서 또 다른 consistent 상태로 바꿔주게 됩니다.
constraints, trigger 등을 통해 DB에 정의된 rules을 transaction이 위반했다면 rollback 해야합니다.
transaction이 DB에 정의된 rule을 위반했는지는 DBMS가 commit전에 확인하고 알려줍니다.
그 외의 application 관점에서 transaction이 consistent 하게 동작하는지는 개발자가 챙겨야합니다.
A가 B에게 30만원을 입금하기 위해 B의 계좌잔액 100만원을 읽은 상태에서 B가 자기 계좌에 20만원을 입금하게 되는 경우
A가 읽은 B의 잔액 100만원과 B가 입금 후 잔액 120이 불일치
A가 입금을 마치면 B의 잔액이 130(100만원+30만원)만원이 되게 됩니다.
두 가지의 transaction이 겹치게 되는 경우 오류가 발생합니다.
여러 transaction 들이 동시에 실행될 때도 혼자 실행되는 것처럼 동작하게 만듭니다.
즉 수행중인 transaciton이 완전히 종료될 때까지 다른 transaction이 참조할 수 없습니다.
DBMS는 여러 종류의 isolaction level을 제공하며 개발자는 isolation level 중에 어떤 level로 transaction을 동작시킬지 설정할 수 있습니다.
concurrency control(동시성 제어)의 주된 목표가 isolation입니다.
commit된 transaction은 DB에 영구적으로 저장합니다.
DB에 문제가 생겨도 commit된 transaction은 DB에 남아 있습니다.
주로 비휘발성 메모리에 저장하며 DBMS가 이를 보장해줍니다.