-
Notifications
You must be signed in to change notification settings - Fork 0
6조 240821 트랜잭션 학습
김수현 edited this page Aug 21, 2024
·
6 revisions
set autocommit = false;
start transaction;
select * from comment where id <= 2000000 and id %2 = 0 for update;
select * from comment;
SELECT * FROM performance_schema.data_locks;
rollback;
- 참고로 for update 대신 for share를 사용하여 read lock을 걸어도 아래의 결과는 동일하다.
- Read Committed에서 for update문(write lock, x-lock)은 조건 절을 통해 레코드에 접근할 때 락을 걸고, 자신이 처리할 레코드가 아니면 즉시 락을 해제한다.-
-
SELECT ... FOR UPDATE
를 실행하면, 해당 조건에 맞는 현재 상태의 데이터에만 배타적 잠금(X Lock)이 걸립니다. 즉,id < 10 AND id % 2 = 0
인 조건에 맞는 행에 대해서만 X Lock이 설정됩니다. -
이는
READ COMMITTED
가 트랜잭션 간의 간섭을 줄이기 위해 설계된 고립 수준이기 때문입니다. 트랜잭션은 변경된 데이터만을 대상으로 잠금을 설정하며, 커밋된 상태의 최신 데이터를 읽습니다. -
결과는 짝수 레코드에만 락이 걸린 것을 확인할 수 있다.
- Repeatable Read에서는 레코드에 락을 걸고, 조건절에 부합하지 않아도 락을 즉시 해제하지 않는다. 즉, 트랜잭션이 끝날 때까지 락을 유지한다.
- 그래서 다른 트랜잭션이 홀수 번 레코드에 어떤 작업을 하려고 시도해도 읽기 및 변경이 불가능하게 된다.
- 결과는 짝수,홀수 모두 락이 걸린 것을 확인할 수 있다.
-
SELECT ... FOR UPDATE
를 실행하면, 조건에 맞는 모든 행에 대해 배타적 잠금(X Lock)을 설정합니다. 여기서 "모든 행"이란id < 10
조건에 맞는 모든 행을 말합니다. 이 경우 조건이id % 2 = 0
인 행만 선택되어 처리되지만, 잠금은id < 10
인 모든 데이터에 걸리게 됩니다. - 이는 REPEATABLE READ가 트랜잭션이 읽은 데이터를 다른 트랜잭션이 수정하지 못하도록 보장하기 위해 설계되었기 때문입니다. 따라서 해당 범위 내의 모든 데이터에 잠금을 걸어 다른 트랜잭션의 변경을 막습니다.
- 배타 잠금은 읽기는 가능한데 수정이 불가능한것 x
- 배타 잠금
- select for update, delete, update 쿼리시 발생
- 다른 트랜잭션이 읽거나 쓰지 못하게 함. 트랜잭션 내에서 특정 데이터를 읽고 이후에 수정할 계획이 있을때 사용.
- 공유 자금:
- shared lock은 허용되지만 exclusie lock은 불가능
- select for share시에 걸림
- 여러 트랜잭션이 데이터를 읽지만 수정할 수는 없도록 하기 위해서 사용
- shared lock은 허용되지만 exclusie lock은 불가능
- 공유잠금을 걸고 update할수는 없다. lock은 레코드가 수정되지 않기 위해서 거는건데 자신이 수정할 계획이 있다면 select for update를 걸어야한다.
- 격리수준에 상관없이 공유잠금을 걸든 배타잠금을 걸든 다른 트랜잭션이 읽을 수는 있다.