[TIL] Transaction Lock

Manta·2024년 10월 30일
0

TIL

목록 보기
20/22

Lock이란?

데이터베이스에서 락(lock)은 동시성 제어를 위해 사용되며, 여러 트랜잭션이 같은 데이터를 동시에 접근할 때 발생할 수 있는 데이터 불일치나 경쟁 상태를 방지합니다. 락은 데이터의 무결성과 일관성을 보장하기 위해 필수적인 메커니즘입니다.

낙관적 vs 비관적

1. 낙관적 락

  • 실제로 읽은 데이터에 대해 다른 접근을 차단하는 것이 아니다.
  • version을 통해 충돌 여부를 확인한다.
  • 동시성 문제가 일어날 가능성이 적은 경우에 사용한다.

2. 비관적 락

  • 트랜잭션 내부에서 데이터를 읽을때 lock을 걸어 다른 접근을 차단한다.
  • 비관적 락에는 "비관적 읽기 락", "비관적 쓰기 락" 등 다양한 방식이 존재한다.
  • 동시성 문제가 일어날 가능성이 높은 경우에 사용한다.

TypeOrm의 비관적 락 방식들

1. pessimistic_read (비관적인 읽기 락):

트랜잭션이 읽은 데이터를 해당 트랜잭션이 종료될 때까지 다른 트랜잭션이 읽는 것을 허용하면서, 쓰기 또는 수정하는 것을 방지합니다.

2. pessimistic_write (비관적인 쓰기 락):

트랜잭션이 읽은 데이터를 해당 트랜잭션이 종료될 때까지 다른 트랜잭션이 읽기, 쓰기, 수정하는 것을 방지하며 접근하지 못하도록 합니다.

3. dirty_read (더티 리드):

SERIALIZABLE isolation level에서 사용되는 Lock 모드로, 다른 트랜잭션이 커밋되지 않은 데이터를 읽는 것을 허용합니다.
다른 트랜잭션이 롤백할 경우, 읽은 데이터는 실제로 존재하지 않았던 것으로 간주됩니다.

4. pessimistic_partial_write (비관적인 부분 쓰기 락):

엔티티의 일부분에 대한 쓰기 작업에만 강력한 Lock을 적용합니다.
부분적인 쓰기 락을 설정하여 특정 필드만 다른 트랜잭션이 수정하지 못하도록 합니다.

5. pessimistic_write_or_fail (비관적인 쓰기 락 또는 실패):

쓰기 작업을 시도하고 실패할 경우 예외를 발생시킵니다.
다른 트랜잭션이 해당 데이터에 쓰기 작업을 수행 중이면 예외가 발생합니다.

6. for_no_key_update (키 업데이트 없음):

엔티티의 키에 대한 업데이트를 허용하지 않습니다.
키 필드가 변경되면 해당 엔티티의 저장이 실패합니다.

7. for_key_share (키 공유):

읽기 작업에 대한 Lock을 걸지 않고, 엔티티의 키만을 공유 Lock으로 설정합니다.
다른 트랜잭션이 해당 엔티티를 읽는 것을 허용하지만, 키에 대한 수정을 막습니다.

profile
공부할게 너무 만타🫠

0개의 댓글