목차
개요
카카오테크캠퍼스 백엔드 과정 주차 관련 공부내용
멀티스레딩 환경 정의
하나의 프로세스 내에서 여러 개의 스레드가 동시에 작동하는 시스템을 의미한다. 각 스레드는 독립적인 작업을 수행하며, 동일한 메모리 공간을 공유한다. 이를 통해 다양한 작업을 동시에 처리하고, 전체적인 시스템의 효율성을 향상시킬 수 있다.
동시성 ; 하나의 코드가 여러번 실행될 수 있다.
예를 들어, 여러 스레드가 동일한 함수에 액세스하고 실행할 수 있다. 이때, 각 스레드는 해당 함수를 독립적으로 실행하며, 서로에게 영향을 주지 않는다.
동시성환경 이슈
- 비결정적인 행동
스레드 스케줄링은 동일한 환경과 조건에서도 다른 결과가 발생할 수 있다. - 테스트의 어려움
동시성 문제는 일반적으로 멀티스레드 환경에서만 발생하기 때문에, 로컬 환경에서 단일 스레드로 테스트할 때는 동시성 이슈를 발견하기 어렵다. - 코드의 복잡성
코드 상에서 명확하게 드러나지 않는다. 특정 함수나 메서드가 스레드에 안전한지 확인하려면, 그 함수나 메서드가 사용하는 모든 데이터와 그 데이터를 다루는 다른 코드를 파악해야 한다.
동시성 이슈와 개발자
- 동시성 제어 메커니즘의 복잡성 락, 모니터, 세마포어 등의 동시성 제어 메커니즘을 통해 해결이 가능하지만 사용하기가 까다롭다.
- 선형적인 사고방식의 한계 개발자는 코드가 순차적으로 실행될 것이라고 생각하지만 실제로는 여러 부분이 동시에 수행될 수 있다.
따라서 멀티스레딩 환경에서의 프로그래밍은 복잡한 동시성 이슈를 고려해야 하며, 이에 대한 철저한 이해와 주의가 요구된다.
우리는 그 중에서 데이터베이스 서비스인 MySQL에서 여러개의 트랜잭션이 동시에 진행될때 락을 사용하여 이러한 동시성 이슈를 해결하는 방법에 대해서 알아보자
정의
락의 주요 목적은 동시성을 관리하고, 데이터의 일관성을 유지하며, 동시에 여러 트랜잭션이 동일한 데이터에 액세스할 수 있도록 하는 것 이라고 정의하고 있다.
읽기 락(read lock)
- 읽기 락은 한 번에 여러 스레드에게 부여될 수 있습니다.
- 이 락이 활성화된 동안, 해당 데이터는 읽을 수 있지만 쓸 수는 없습니다. → 한 스레드가 데이터를 읽는 동안 다른 스레드가 동시에 데이터를 수정하는 것을 방지하여 동일한 데이터를 동시에 읽는 여러 스레드간의 일관성을 보장할 수 있습니다.
쓰기 락(write lock)
- 쓰기 락은 한 번에 오직 하나의 스레드에게만 부여될 수 있습니다.
- 이 락이 활성화된 동안, 해당 데이터를 읽거나 쓸 수 있는 것은 오직 그 락을 보유한 스레드뿐입니다. 다른 스레드는 그 락이 해제될 때까지 대기해야 합니다. → 한 스레드가 데이터를 수정하는 동안 다른 스레드가 동시에 동일한 데이터를 읽거나 쓰는 것을 방지하여 데이터의 일관성을 보장합니다.
락의 종류
래퍼런스를 참고해보니 InnoDB에서 제공해주는 락이 더 많은 분류를 통해 나눠지고 있었다.
일단 강의에서 주로 설명해주는 읽기, 쓰기 락에 대해서는 Shared exclusive locks 로 분류하여서 나타내주고 있는데
MySQL :: MySQL 8.0 Reference Manual :: 15.7.1 InnoDB Locking
읽기락은 공유락(S) 로 쓰기락은 배타적락(X)으로 표현을 하고 있었다.
표기에 의문이 들어서 좀 더 확인을 해보니
공유락 Shared lock - 읽기 작업
SQL
SELECT FOR SHARE 를 사용하여 특정 데이터로부터 공유 락을 획득할 수 있다.
SELECT * FROM table_name WHERE id = 1 FOR SHARE;
설명
공유락의 경우에는 일반적으로 '읽기' 작업에 사용되며, 이는 해당 데이터 항목에 대한 동시 수정을 방지하는데 사용된다고 한다.
→ 하나의 트랜잭션이 공유 잠금을 소유하고 있는 동안 다른 트랜잭션은 동일한 데이터에 대한 수정(쓰기)을 수행할 수 없다.
하지만 그런 상황에서도 여러 트랜잭션이 동시에 데이터를 읽을 수 있으므로, 이것이 바로 공유 잠금의 이름의 유래이다.
공유 잠금은 쓰기 연산에 직접적으로 사용되지는 않지만, 쓰기 연산을 안전하게 수행하기 위해 중요한 역할을 한다.
배타적락 Exclusive lock - 쓰기 작업
SQL
SELECT FOR UPDATE 를 사용하여 특정 데이터로부터 배타적 락 을 획득할 수 있다.
SELECT * FROM table_name WHERE id = 1 FOR UPDATE;
설명
배타적락의 경우엔 일반적으로 ‘쓰기’ 연산에 사용된다.
이 경우엔 트랜잭션은 해당 행을 수정하거나 삭제할 수 있지만 해당 행에 대한 다른 모든 락 요청을 막기 때문에 배타적락이 있는 동안에는 다른 트랜잭션에서 해당 행을 읽거나 쓸 수 없다.
배타적락을 사용하면 데이터를 안전하게 변경할 수 있다.
따라서 강의에서 강사님이 읽기락, 쓰기락으로 해당 락에 대해서 설명을 하셨던것 같다.
마무리
다음 포스팅에서는 이번에 배운 S/X락보다 낮은 레벨의 락이라고도 할수 있는 의도적 락 과 두 작업이 서로 의 자원을 대기하면서 무한적으로 대기하게 되는 데드락에 대해서 배워보겠다.
'미사용 > KakaoTechCampus' 카테고리의 다른 글
MySQL기초[3]- 데이터 베이스 인덱싱 (0) | 2023.06.14 |
---|---|
MySQL기초[2]- 캐싱,버퍼풀 전략 (0) | 2023.06.14 |
MySQL기초[1]- 고전 3티어 구조 및 MySQL엔진 구성요소 (0) | 2023.06.14 |
Java기초[10] 인터페이스 기본개념으로 알아보는 다형성 (0) | 2023.04.28 |
Java기초[9] 전략&템플릿 메서드 패턴 (0) | 2023.04.28 |