✔️ 동시성 이슈란?
동시성 뜻은 어떤 두 사건이 같은 시간에 일어나는 것을 이르는 말
예시) 특정 웹사이트에 100명이 동시에 버튼을 눌렀을 때 100번 DB의 입력이나 수정이 될텐데 누락되는 이슈
동시성 제어로 누락이 안되게 한다.
🤔 RDBMS 동시성 제어
1. 낙관적 락
- 어플리케이션 레벨에서 제어 (ORM)
- JPA에서 @Transaction에서 기본적으로 작동되는 락
- 여러 트랜잭션이 데이터를 접근 할 때, 충돌을 방지하기 위해 일단 데이터를 읽고 트랜잭션이 커밋하기 전에 충돌을 확인
충돌이 발생할 경우에 롤백하고 재시도 - 실제 사용시에는 Entity에 Version 어노테이션을 사용한다.
- 용도: 충돌이 많지 않고 수정시에 사용한다.
@Entity
@Getter
@Table(name = "cards")
@AllArgsConstructor
@NoArgsConstructor
@DynamicUpdate
public class Card {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column
private Long id;
@ManyToOne
@JoinColumn(name = "users_id", nullable = false)
private User users;
@ManyToOne
@JoinColumn(name = "columns_id", nullable = false)
private Columns columns;
@Column(nullable = false)
private String cardName;
@Column
private String cardDescription;
@Column
private String cardColor;
@Column
private Integer cardOrder;
@Column
private LocalDate deadLine;
@Column
private String url;
@Column
private String worker;
@Version
private Integer version;
}
2. 비관적 락
- 데이터베이스 레벨에서 제어 (RDBMS)
- 트랜잭션이 데이터에 액세스할 때 해당 데이터를 잠금 처리하여 다른 트랜잭션이 동시에 수정할 수 없도록 하는 방식
- 실제 사용시에는 repostiory의 메소드에 Lock을 걸어준다
- 용도: 수정, 조회 가능
- 데드락 (교착 상태)
- 많은 사용자가 동시에 할 수록 데드락이 가능성이 높아진다.
- 방지 할려면 트랙잭션 짧게 유지하고 락을 최소한 사용 실행 순서를 일관되게 관리해야한다.
2-1. 공유 락(읽기 락)
- 여러 트랜잭션이 읽기는 가능 하지만 수정은 안됨
- 다수의 트랜잭션이 동시에 읽을 때 사용, 수정은 안됨
- 변경중인 리소스를 동시에 읽을 수는 없다.
public interface CardRepository extends JpaRepository<Card, Long> {
@Lock(LockModeType.PESSIMISTIC_READ)
List<Card> findAllByColumnsId(Long ColumnsId);
}
2-2. 베타 락(쓰기 락)
- 트랜잭션이 데이터를 수정 할 때 다른 트랜잭션이 읽거나 수정하지 못하게 배타적으로 잠금 처리
- 트랜잭션이 완료 될때까지 다른 트랜잭션이 데이터를 읽거나 쓰기가 안됨
public interface CardRepository extends JpaRepository<Card, Long> {
@Lock(LockModeType.PESSIMISTIC_WRITE)
List<Card> findAllByColumnsId(Long ColumnsId);
}
👍 참고 사이트
https://wookjongbackend.tistory.com/39
트랜잭션의 개념과 락(Lock)과 동시성에 대해 알아보자!
트랜잭션이란?? 트랜잭션이란, 데이터베이스의 상태를 변경시키기 위해 수행하는 작업 단위 또는 한꺼번에 수행되어야 할 일련의 연산들을 의미합니다. 주로 UPDATE, INSERT, DELETE와 같은 데이터베
wookjongbackend.tistory.com
https://jokerkwu.tistory.com/125
[ 기술면접 / 데이터베이스 ] 동시성 제어( Concurrency Control )
동시성 제어( Concurrency Control ) 란? 동시에 실행되는 여러 개의 트랜잭션이 작업을 성공적으로 마칠 수 있도록 트랜잭션의 실행 순서를 제어하는 기법이다. 동시성 제어의 정의 다중 사용자 환경
jokerkwu.tistory.com
'항해99' 카테고리의 다른 글
항해99 주특기 프로젝트 (7일차) (0) | 2024.01.19 |
---|---|
항해99 주특기 프로젝트 (6일차) (0) | 2024.01.18 |
항해99 주특기 프로젝트 (4일차) (0) | 2024.01.17 |
항해99 주특기 프로젝트 (3일차) (0) | 2024.01.15 |
항해99 주특기 프로젝트 (2일차) (0) | 2024.01.13 |