🚀
Growth log
  • About me
  • I LEARNED
    • General
      • 개발자 꿀팁
      • 그로스해킹 기초
      • 개발자에게 도메인 지식은 얼마나 중요할까?
      • DTO 논쟁에 대하여
      • MSA란?
    • Seminar
      • 테스트 커버리지 100% - SLASH 21
      • TDD가 실패하는 이유 - by 이규원님
      • 대규모 트래픽 애플리케이션 성능 튜닝 노하우 다 알려 드림|라인개발실록
      • 결제 시스템의 SDK와 API 디자인 - SLASH 21
    • Web
      • SOP와 CORS
    • Spring & OOP
      • DTO vs VO
    • Ruby On Rails
      • Rails lib 디렉토리에 대하여
      • Rails의 concerns란?
      • Rails에서의 GC 작동원리
      • Eager loading vs Lazy loading
      • Rails 환경 구성
      • ActionCable
      • 📔Perfect ruby on rails
        • MVC 패턴인 Rails
        • Ruby on Rails 기본 - 컨트롤러
        • Ruby on Rails 기본 - 뷰
        • Ruby on Rails 기본 - 모델
        • 스캐폴딩 기능을 사용한 Rails 개발 기초
        • 뷰 개발
        • 모델 개발
        • 모델 개발 - 낙관적 동시 실행 제어
        • 모델 개발 - 유효성 검사 구현
        • 모델 개발 - Association
        • 모델 개발 - 콜백
        • 모델 개발 - 마이그레이션
        • 모델 개발 - 데이터 초기화
        • 컨트롤러 개발 - 요청 정보 추출
        • 컨트롤러 개발 - 응답
        • 컨트롤러 개발 - 상태 관리
        • 라우팅 - RESTful
        • 라우팅 - RESTful 인터페이스의 사용자 정의화
        • 라우팅 - RESTful 하지 않은 라우트 정의
        • 테스트
        • 테스트 - 준비
        • 테스트 - Unit 테스트
        • 테스트 - Functional 테스트
        • 테스트 - Integration 테스트
        • 클라이언트 개발 - Sprockets vs Webpacker
        • 클라이언트 개발 - Sprockets
    • Node.js & Express
      • 기본 개념
      • npx
    • Programing Language
      • Java
        • JavaDoc에 대해
        • invocation에 대해서
        • 어노테이션
        • 추상클래스 & 인터페이스
        • Package
        • 오버로딩 vs 오버라이딩
      • Javascript
        • TCP School 훑어보기
          • 타입
          • 형 변환
          • 변수
          • 연산자
          • 반복문
          • 배열(array)
          • 함수
          • 함수 - 스코프와 호이스팅
          • 함수 - 매개변수와 인수
          • 함수 - 미리 정의된 전역 함수
          • 객체
          • 프로토타입
          • DOM
          • BOM - Window 객체
          • 이벤트(event)
      • Ruby
        • 📔퍼펙트 루비
    • DB
      • Redis
        • Redis 개요
      • Index(인덱스)?
      • DB Transaction & Lock
      • 동시성 제어에 관하여
      • Lock(잠금)이란?
      • ActiveRecord lock vs with_lock
      • Table lock vs Row lock
      • WHERE 1=1 구문에 대하여
      • COUNT(*) vs COUNT(indexed column)
      • 📕관계형 데이터베이스 실전입문
      • 📔SQL 첫걸음
      • 📔모두의 SQL
    • Design Patterns
      • Observer pattern
      • Flyweight pattern
      • Singleton pattern
    • OOP
      • 📔오브젝트
        • 6장 메시지와 인터페이스
      • 클래스간 관계 간단 정리
    • Regex
    • Collaboration
      • Git
      • Sourcetree
  • DAILY REVIEW
    • 2021
      • August
        • 2021-08-25(Wed)
        • 2021-08-23(Mon)
        • 2021-08-11(Wed)
        • 2021-08-04(Wed)
        • 2021-08-03(Tue)
        • 2021-08-02(Mon)
      • July
        • 2021-07-29(Thu)
        • 2021-07-26(Mon)
        • 2021-07-23(Fri)
        • 2021-07-22(Thu)
        • 2021-07-21(Wed)
        • 2021-07-20(Tue)
        • 2021-07-19(Mon)
        • 2021-07-15(Thu)
        • 2021-07-14(Wed)
        • 2021-07-13(Tue)
        • 2021-07-12(Mon)
      • June
        • 2021-06-05(Sat)
        • 2021-06-04(Fri)
        • 2021-06-03(Thu)
        • 2021-06-02(Wed)
        • 2021-06-01(Tue)
      • May
        • 2021-05-31(Mon)
        • 2021-05-29(Sat)
        • 2021-05-28(Fri)
        • 2021-05-27(Thu)
        • 2021-05-26(Wed)
        • 2021-05-25(Tue)
        • 2021-05-24(Mon)
        • 2021-05-22(Sat)
        • 2021-05-21(Fri)
        • 2021-05-20(Thu)
        • 2021-05-19(Wed)
        • 2021-05-18(Tue)
        • 2021-05-17(Mon)
        • 2021-05-15(Sat)
        • 2021-05-13(Thu)
        • 2021-05-12(Wed)
        • 2021-05-11(Tue)
        • 2021-05-10(Mon)
        • 2021-05-03(Mon)
      • April
        • 2021-04-30(Fri)
        • 2021-04-29(Thu)
        • 2021-04-28(Wed)
        • 2021-04-27(Tue)
        • 2021-04-26(Mon)
        • 2021-04-24(Sat)
        • 2021-04-23(Fri)
        • 2021-04-21(Wed)
        • 2021-04-20(Tue)
        • 2021-04-19(Mon)
        • 2021-04-18(Sun)
        • 2021-04-16(Fri)
        • 2021-04-15(Thu)
        • 2021-04-14(Wed)
        • 2021-04-12(Mon)
        • 2021-04-11(Sun)
        • 2021-04-09(Fri)
        • 2021-04-08(Thu)
        • 2021-04-06(Tue)
        • 2021-04-05(Mon)
        • 2021-04-04(Sun)
        • 2021-04-03(Sat)
        • 2021-04-02(Fri)
        • 2021-04-01(Thu)
      • March
        • 2021-03-29(Mon)
        • 2021-03-28(Sun)
        • 2021-03-26(Fri)
        • 2021-03-25(Thu)
        • 2021-03-24(Wed)
        • 2021-03-23(Tue)
        • 2021-03-22(Mon)
        • 2021-03-21(Sun)
        • 2021-03-20(Sat)
        • 2021-03-17(Wed)
        • 2021-03-16(Tue)
        • 2021-03-15(Mon)
        • 2021-03-12(Fri)
        • 2021-03-11(Thu)
        • 2021-03-10(Wed)
        • 2021-03-09(Tue)
        • 2021-03-08(Mon)
        • 2021-03-07(Sun)
        • 2021-03-05(Fri)
        • 2021-03-03(Wed)
        • 2021-03-02(Tue)
        • 2021-03-01(Mon)
      • Feb
        • 2021-02-26(Fri)
        • 2021-02-25(Thu)
        • 2021-02-24(Wed)
        • 2021-02-23(Tue)
        • 2021-02-22(Mon)
        • 2021-02-19(Fri)
        • 2021-02-18(Thu)
        • 2021-02-17(Wed)
        • 2021-02-16(Tue)
        • 2021-02-15(Mon)
        • 2021-02-14(Sun)
        • 2021-02-13(Sat)
        • 2021-02-12(Fri)
        • 2021-02-10(Wed)
        • 2021-02-09(Tue)
        • 2021-02-08(Mon)
        • 2021-02-07(Sun)
        • 2021-02-05(Fri)
        • 2021-02-03(Wed)
        • 2021-02-02(Tue)
        • 2021-02-01(Mon)
      • Jan
        • 2021-01-29(Fri)
        • 2021-01-28(Thu)
        • 2021-01-27(Wed)
        • 2021-01-26(Tue)
        • 2021-01-25(Mon)
        • 2021-01-23(Sat)
        • 2021-01-22(Fri)
        • 2021-01-20(Wed)
        • 2021-01-19(Tue)
        • 2021-01-18(Mon)
        • 2021-01-12(Tue)
        • 2020-01-11(Mon)
        • 2021-01-08(Fri)
        • 2021-01-07(Thu)
        • 2021-01-06(Wed)
        • 2021-01-05(Tue)
        • 2021-01-04(Mon)
        • 2021-01-01(Fri)
    • 2020
      • Dec
        • 2020-12-30(Thu)
        • 2020-12-25(Fri)
        • 2020-12-24(Thu)
        • 2020-12-23(Wed)
        • 2020-12-22(Tue)
        • 2020-12-21(Mon)
        • 2020-12-18 (Fri)
      • Nov
        • 2020-11-30(Mon)
        • 2020-11-28(Sat)
        • 2020-11-26(Thu)
        • 2020-11-25(Wed)
        • 2020-11-24(Tue)
        • 2020-11-23(Mon)
        • 2020-11-22(Sun)
        • 2020-11-20(Fri)
        • 2020-11-19(Thu)
        • 2020-11-18(Wed)
        • 2020-11-17(Tue)
        • 2020-11-14(Sat)
        • 2020-11-13(Fri)
        • 2020-11-12(Thu)
        • 2020-11-11(Wed)
        • 2020-11-09(Mon)
        • 2020-11-07(Sat)
        • 2020-11-05(Thu)
        • 2020-11-04(Wed)
        • 2020-11-03(Tue)
        • 2020-11-02(Mon)
    • Good article 아카이빙
Powered by GitBook
On this page
  • Lock의 정의
  • Lock의 종류
  • Lock의 단위
  • 2단계 locking(2PL, 2 Phase Locking)
  • Optimistic Lock
  • Pessimistic Lock

Was this helpful?

  1. I LEARNED
  2. DB

Lock(잠금)이란?

Lock은 동시성 제어 기법이다.

Lock의 정의

동시에 접근하여 수정하려고 할 때 데이터베이스의 일관성이 깨질 수 있다. 이걸 막기 위해 트랜잭션과 lock이 쓰인다.

트랜잭션이 사용하는 자원에 대해서 상호 배제(Mutual Exclusive) 기능을 제공하는, 동시성 제어 기법이 lock이다.상호 배제란 특정 트랜잭션이 데이터 항목에 대하여 잠금(Lock)을 설정한 트랜잭션이 해제(unlock) 할 때까지 데이터를 독점적으로 사용할 수 있는 것을 뜻한다.

Lock의 종류

공유 Lock(Shared Lock)

  • Read Lock이라고도 한다.

  • 공유 잠금한 트랜잭션이 데이터 항목에 대하여 읽기(read)만 가능

  • 다른 트랜잭션도 읽기(Read) 만을 실행 할 수 있는 형태

전용 Lock(Exclusive Lock)

  • Write Lock이라고도 한다.

  • 전용 잠금한 트랜잭션은 데이터 항목에 대해서 읽기(read)와 기록(write)가 모두 가능

  • 다른 트랜잭션은 읽기(read)와 기록(write) 모두 할 수 없다.

그래서 읽기 잠금은 쓰기 잠금과 충돌을 일으키며, 쓰기 잠금은 읽기 잠금 및 쓰기 잠금과 충돌을 일으킨다.

Lock의 단위

Locking 단위가 큰 순서에서 작은 순서로 나타내면 아래와 같다.

  1. 데이터베이스

    • DB 전체에 영향이 있는 DB 업데이트와 같은 작업에서만 사용한다.

  2. 릴레이션(파일)

    • 데이터베이스에서 파일이란, 테이블 등과 같이 실제 데이터가 쓰여지는 물리적인 저장소를 뜻한다. 파일 전체를 백업할 때 사용한다.

  3. 테이블

    • 전체 테이블에 대해 데이터 변경이 있을 경우 사용한다.

    • DDL 구문을 사용할 때 Lock이 걸린다고하여 DDL Lock이라고도 한다.

  4. 페이지와 블럭

    • 파일을 구성하는 페이지와 블록을 기준으로 Lock이 걸린다.

  5. 컬럼(Column)

    • Lock 설정 및 해제 시 리소스가 많이 들어서 잘 사용하지 않는다.

  6. 행(Row)

    • 가장 많이 사용되는 Lock이다.

Locking 단위가 클 수록

  • 구현이 용이하다.

  • 동시성이 약하다.

  • Locking 오버헤드가 감소한다.

2단계 locking(2PL, 2 Phase Locking)

모든 트랜잭션을 확장 단계와 수축 단계로 나누어서 수행한다.

  • 확장 단계: 트랜잭션은 lock만 수행할 수 있고, unlock은 수행할 수 없는 단계

  • 수축 단계: 트랜잭션은 unlock만 수행할 수 있고, lock은 수행할 수 없는 단계

직렬 가능성을 보장할 수 있는 규약으로 많이 사용된다.

문제는 교착 상태가 발생할 가능성이 있다는 것이다. 이를 교착 상태 예방과 교착 상태 탐지로 해결한다.

Optimistic Lock

  1. 낙관적인

    기본적으로 데이터 갱신시 충돌이 발생하지 않을 것이라고 낙관적으로 보는 것.

  2. 비선점적인 트랜잭션을 커밋하는 시점의 버전을 통해서 데이터를 관리한다. DB단에서 락을 하는 것이 아니라, 어플리케이션 레이어에서 거는 락이다. 충돌이 나는 경우에 이를 방지하는 정도이다.

  • 장점

    • Pessimistic Lock에 비해 성능상의 이점이 있다.

    • 데드락 가능성이 적다.

  • 단점

    • 충돌시 오버헤드가 생긴다. 커밋하는 시점에 충돌여부를 감지하므로, 커밋 전체를 롤백하며 오버헤드가 생기는 것.

Pessimistic Lock

  1. 비관적인

    기본적으로 데이터 갱신시 충돌이 발생할 것이라고 비관적으로 보고 미리 잠금을 건다.

  2. 선점적인

    데이터 갱신시 충돌이 발생할 것이라고 예상하기 때문에, 우선적으로 락을 건다. 즉, 조회할 때 부터 건다.

  • 장점

    • 무결성을 지키기 용이하다

    • 충돌에 대한 오버헤드가 줄어든다.

  • 단점

    • 충돌이 없으면 오버헤드가 발생한다.

    • 데드락의 위험성이 있다.

그래서 어떤 상황에 무엇을 택해야하는가?

락은 비싸므로, 아래 상황을 고려해서 선택하자.

  • 충돌이 자주 발생하는 상황인가?

    • 자주 발생한다면 Pessimistic Lock이 좀 더 적절할 것이다.

  • 읽기와 수정하기의 비율은 어디에 가까운가?

    • 읽기가 더 많다면 Optimistic Lock이 좀 더 적절할 것이다.

    • 그래서 일반적으로 웹 어플리케이션은 Optimistic Lock을 주로 사용한다.

PessimisticLock Scope로 연관관계 설정도 할 수 있다.

Previous동시성 제어에 관하여NextActiveRecord lock vs with_lock

Last updated 3 years ago

Was this helpful?

하나의 트랜잭션 내에서 확장단계를 거치고, 수축단계를 거치면서 lock & unlock 수행 [출처: 지식덤프]