지난번 트랜젝션이 도대체 어떤것인지에 대해 알아보았다.
이번에는 트랜젝션을 어떻게 사용할 것인지 좀더 자세히 알아보겠다.
🚗 LOCK
- 락(Lock)은 동시성을 제어하기 위해 사용하는 기능이다.
- 해당하는 데이터를 점유하여 다른 트랜잭션의 접근을 막아 동시성과 일관성의 균형을 맞추기 위해 사용
1. shared Locks, Read Locks (공유락, 읽기락)
- read전용 락.
- 다른 트랜젝션이 데이터 읽는거 허용, 그러나 수정하는건 금지.
- 이 락을 사용하는 트랜잭션이 모든 작업을 수행했다면 공유락은 해제
- 즉 작업이 끝나면 공유락 해제
# 트랜잭션을 시작합니다.
START TRANSACTION;
# SPARTA 테이블을 조회할 때, 해당 데이터들에 공유 락을 설정합니다.
SELECT * FROM SPARTA LOCK IN SHARE MODE;
2. Exclusive Locks 베타락, WRITE Locks 쓰기락 __ 수정작업
- 특정 트랜잭션이 데이터를 읽거나 수정하는 동안 다른 트랜잭션은 접근할 수 없게 하는 락.
- 다른 트랜젝션이 데이터를 읽거나 수정하는것 금지.
- write 전용 락. 트랜잭션이 해당하는 데이터 점유하고 있으면다른 트랜잭션이 접근 못하도록.
# 트랜잭션을 시작합니다.
START TRANSACTION;
# SPARTA 테이블을 조회할 때, 해당 데이터들에 배타 락을 설정합니다.
SELECT * FROM SPARTA FOR UPDATE;
🐣 락킹 수준(Locking Level)
1. 글로벌 락(Global Locks) , 데이터베이스 락(Database Locks)
- 다른 트랜잭션들 모든테이블 접근 금지
- 데이터베이스의 모든 테이블에 락을 걸어서
- 현재 트랜잭션을 제외한 나머지 트랜잭션들이 모든 테이블을 사용할 수 없도록
- 가장 높은 수준의 락을 가지고 있으며, 가장 큰 범위를 가지고 있다.
# 글로벌 락을 획득합니다.
# MySQL 서버에 존재하는 모든 테이블에 락을 겁니다.
FLUSH TABLES WITH READ LOCK;
https://dev.mysql.com/doc/refman/8.0/en/innodb-locking.html
2. 테이블 락(Table Locks)
- 자주 안쓴다고 한다.
- 다른 사용자가 작업중인 테이블을 동시에 수정하지 못하도록 합니다.
- 해당 테이블에 대한 접근 막음.
- 작업 끝난후 해제
# SPARTA 테이블에 테이블 락을 설정합니다.
LOCK TABLES SPARTA READ;
https://dev.mysql.com/doc/refman/8.0/en/innodb-locking.html
3. 네임드 락(Named Locks)
- 테이블이나 테이블의 행과같은 DB 오브젝트가 아닌, 특정한 문자열을 점유.
- 특정 데이터베이스 객체에 이름을 지정하여 해당 객체에 락(Lock)을 설정하는 방법을 말한다.
- 그니깐 락인데 이름이 있음. 명시적으로 이름 부여
- 다른 트랜젝션에서 동일한 이름쓴다? 그럼 바로 접근 금지! 및 관리
- 데이터베이스 전체에서 사용 가능. 테이블 뿐만 아니라
- 수동으로 해제해야함. 그러기 전까지 트랜젝션들 해당 소스에 접근 못함.
# sparta_name 문자열을 획득합니다.
# 만약, 10초 동안 획득 하지 못한다면, NULL을 반환합니다.
SELECT GET_LOCK('sparta_name', 10);
https://dev.mysql.com/doc/refman/8.0/en/locking-functions.html
4. 메타데이터 락(Metadata Locks)
- 가장 많이 쓰임.
- 메타데이터에 대한 접근 관리 (테이블구조, 인덱스, 권한 등)
- 다른 사용자가 작업중인 테이블의 동일한 행 및 동일한 데이터베이스의 객체를 동시에 수정하지 못하도록 한다.
- 즉 동시에 동일한거 수정 못하도록.
- 데이터베이스 구조나 스키마를 변경하는 작업을 수행할 때도 사용.
- 메타데이터 락은 테이블 락보다 더 큰 범위를 가지며,
- 데이터베이스의 메타데이터에 대한 접근을 제한하고 변경하는 작업을 수행할 때 사용된다.
- 특정 테이블에 대한 작업이 아닌 데이터베이스 전체에 영향을 미친다.
# 테이블 구조를 변경할 때, MySQL은 내부적으로 메타데이터 락을 설정합니다.
ALTER TABLE SPARTA ADD COLUMN Age Int;
https://dev.mysql.com/doc/refman/8.0/en/metadata-locking.html
이처럼 락은 다양한 락킹 수준을 가지고 있다.
만약 락설정을 잘못하게 된다면, 모든 api가 동작하지 않는 "교착상태(Dead Lock)" 이 발생하여,
프로그램이 멈춰버리는 문제가 발생할 수 있다.
🦋 교착상태(Dead Lock)
여러 테이블에 락(Lock)을 적용하여, 다른 작업이 처리되지 못하게 점유하고 있는 작업이 있을 때,
다른 작업을 끝나는 것을 무한정 기다리는것을 나타낸다.
이를 해결하기 위해 락에 대한 구성을 잘 고려해야한다고 한다.
이부분은 실제로 코드를 작성해봐야 이해가 더 잘 될꺼 같다.
일단은 이런 락이 있구나 정도로 넘어간다.
'TIL' 카테고리의 다른 글
23/12/03 TIL __ 3계층 아키텍쳐 (0) | 2023.12.03 |
---|---|
23/12/02 TIL __ 트랜잭션 3. 격리 수준과 프리즈마에서의 사용. (1) | 2023.12.02 |
23/11/30 TIL __ prisma 에서 테이블 조인하기 (0) | 2023.12.01 |
23/11/29 TIL __ prisma 사용하기 (0) | 2023.11.30 |
23/11/28 TIL __ 트랜잭션 이란? (0) | 2023.11.29 |