트랜잭션이란 SQL이 실행되는 하나의 작업단위같은 개념이다
그리고 하나의 테이블에 SQL은 동시에 여러개가 실행 될 수도 있다
하지만 동시에 여러개가 실행되면
SELECT문을 실행하고 있는데 도중에 UPDATE가 되버려서 도중에 결과값이 바뀌게 된다
예를들면
회원정보를 검색하는데 도중에 회원정보가 업데이트 되면
업데이트가 되기전에 검색해서 나온건 옛날 정보고
업데이트가 끝난후에 검색해서 나온건 최신 정보라서 결과가 달라지게 된다
이러한 것을 막고자 하나의 SQL문이 실행될때는 다른 SQL이 실행되지 않고
대기 시키거나 캔슬하는 트랙잭션 락이 있다
회원정보 테이블을 검색하는 FOR UPDATE이 선언된 A라는 SQL문이 실행 되고 있는데
회원정보 테이블을 업데이트 하는 B라는 SQL문이 실행되면
B라는 SQL문은 A라는 SQL문이 끝날때까지 기다리거나 캔슬된다
#FOR UPDATE
- FOR UPDATE -> 락이 걸린 SQL문이 종료될때 까지 계속 기다림
- FOR UPDATE NOWAIT -> 기다리지 않고 끼어든 SQL문을 캔슬(ORA-00054)
- FOR UPDATE WAIT SECOND -> ~초 만큼 대기 후 작업이 끝나지 않으면 끼어든 SQL문을 캔슬
- FOR UPDATE OF TABLE_A, TABLE_B -> TABLE A, B에 LOCK 걸음
#사용법
SELECT
FROM FREEBOARD
WHERE
FOR UPDATE
사용법은 간단하다 SQL문 가장 뒤에 FOR UPDATE를 작성하면된다
그럼 FROM에 선언된 테이블은 락이 걸려서 해당 SQL문이 끝날때까지 다른SQL문은 해당 테이블을 액세스 하지 못한다
락이 걸린 트랜잭션(FOR UPDATE가 선언된 SQL문)은 커밋(갱신)이 되거나 롤백(취소)이 되야만 락이 해제 된다
그리고 락이 해제되면 그 이후로 순차대로 SQL문이 실행된다
이것이 트랜잭션 락의 개념이다