트랜잭션 - DB 예제1 - 개념 이해
트랜잭션 - DB 예제2 - 자동 커밋, 수동 커밋
- 자동 커밋
- 자동 커밋으로 설정하면 쿼리 실행 직후 커밋을 호출.
set autocommit = true;
- 수동 커밋
set autocommit = false;
- 보통 자동 커밋 모드가 기본인 경우가 많기 때문에 수동 커밋으로 설정하는 것을 트랜잭션을 시작한다고 표현한다.
- 꼭 commit 또는 rollback을 호출해 트랜잭션 결과를 DB에 반영할지 말지 결정해야 한다.
- 커밋 모드는 한번 설정하면 해당 세션에서는 계속 유지된다.
트랜잭션 - DB 예제3 - 트랜잭션 실습
트랜잭션 - DB 예제4 - 계좌이체
- 오토 커밋의 문제점
- 원자적으로 처리해야 할 작업들을 원자적으로 처리할 수 없다.
- 오토 커밋 모드에서 계좌 이체 작업을 하는데 송금 계좌의 잔액을 차감하는 작업은 성공했지만 수금하는 계좌의 잔액을 증액하는 작업은 실패했다고 가정해보자. 오토 커밋 모드는 하나의 쿼리가 끝날 때마다 커밋하기 때문에 송금 계좌의 잔액만 차감된 상태로 계좌 이체 작업이 끝나게 된다.
DB 락 - 개념 이해
- 격리성
- 서로 다른 세션의 트랜잭션들이 동시에 같은 데이터를 수정하려고 하면 격리성이 깨진다.
- 락 획득과 반납
- 세션이 트랜잭션을 시작하고 데이터를 수정한 후 커밋 또는 롤백을 호출할 때까지 변경하려는 로우의 락을 획득하여 다른 세션이 해당 데이터를 수정할 수 없도록 해야 한다.
- 커밋 또는 롤백을 호출하면 락을 반납해 다른 세션이 락을 획득할 수 있다.
- 락을 획득하지 못한 세션은 락을 가지고 있는 세션이 락을 반납할 때까지 대기한다.
- 무한정 대기하지는 않고 정해진 대기 시간만큼 대기한다.
set LOCK_TIMEOUT = 60000
- 60초 대기(60초 지나면 락 타임아웃 오류)
DB 락 - 변경
DB 락 - 조회
- 조회 시 락은 불필요
- DB마다 다르지만, 보통은 데이터 조회 시에는 락을 획득하지 않아도 데이터를 조회할 수 있다.
- select for update 문
- 경우에 따라 데이터 조회 시에도 락을 획득해 다른 세션이 데이터를 수정하는 것을 막을 필요가 있다.
- select for update문을 사용하면 락을 획득하여 데이터를 조회
select * from member where member_id = 'memberA' for update;