하나의 테이블을 여러 데이터로 쪼개어 저장하는 것
[ 사진 출처 : Understanding Database Sharding ]


같은 데이터를 여러 분산 노드에 동일하게 저장
쓰기 담당 / 읽기 담당을 나누어, 쓰기 발생 시 읽기 담당 노드 모두에 동기화 일치
CQRS 사용 시 어플리케이션의 퍼포먼스, 확장성, 보안성을 극대화
Pessimistic Concurrency Control(PCC)
작업 수행 전 잠금으로 충돌을 방지하고 하나의 작업만 수행
데이터베이스 Built-in Lock
: “데이터 일관성은 데이터베이스가 알아서”
선 Lock 체크 (Preempt 선점, 점유) → 후 작업
: Lock 을 통해 작업 전에 잠그고, 작업 후에 Lock 을 해지
데이터 무결성 보장 수준이 높으나 (Lock 으로 충돌 여부를 미리 방지) | 동시성 떨어짐 + 데드락 발생 위험성
Pessimistic Lock 세부 방법론
1. Lock-based Concurrency Control
- 2PL (2 Phase Locking) : Serializable 보장을 위한 Locking 방법
 - 2PL 을 확장한 더 많은 방법론(Strict 2PL(S2PL), Rigorous 2PL(SS2PL))들 존재
 
Non-locking Concurrency Control 혹은 Optimistic Concurrency Control(OCC)
동시에 발생한 요청 중 먼저 완료 표기한 하나의 승자 요청을 제외하고 나머지 요청에게 실패 전달 및 롤백
소프트웨어적 Lock : 개발자가 알아서 처리

선 작업 → 후 버전 체크
: Lock 없이 먼저 수행한 뒤에, Commit 직전에 꼭 버전 체크 (중간에 누가 썼나)
OptimisticLockException
: 쓰기 시 버전 충돌이 발생하면 작업한 내용을 개발자가 직접 롤백 필요

동시성 좋으나 | 데이터 무결성 보장 수준이 낮고 + Versioning, Exception 처리에 대한 추가 개발 필요
Optimistic Locking 세부 방법론
1. Timestamp-based Concurrency Control
2. Multiversion Concurrency Control (MVCC)
- MVCC 는 동시성(Concurrency) 과 성능(Performance) ↔ 일관성(Consistency)과의 trade-off
 - MVCC 는 MySQL 와 PostgresQL 에서도 사용
 
→ 트랜잭션에 따른 전체 DB 처리량 저하 방지 위해- MVCC 동작 원리
 
- Lock 기법만 적용된 DBMS 보다 훨씬 빠르게 동작
 - 사용하지 않는 데이터가 매번 생기므로 데이터를 정리하는 시스템 필요
 - 데이터 버전이 충돌 시 애플리케이션 영역에서 (소프트웨어적으로) 문제 해결
 A. 데이터베이스 내 다중 버전의 데이터를 저장
: PostgreSQL 에서 사용하는 방식
B. 최신 버전의 데이터만 데이터베이스에 저장
: Oracle, MySQL 에서 사용하는 방식[ 사진 출처 : [MySQL] MVCC(다중 버전 동시성 제어)와 데이터베이스가 트랜잭션을 지원하는 방법과 동작 과정 ]
- NoSQL 중 하나인 Couchbase 는 CAS(Compare-and-Swap) 를 사용
 
값이 변경될 때마다 “변경여부만” 알 수 있는 값을 CAS 라 하며
매 번 문서를 읽을 때마다 CAS 값을 읽고, 수정(Write) 할 때마다 앞서 읽은 CAS 값을 DB 에게 전달
이때 DB 는 CAS 값이 변경되었는지 확인(받은 CAS 값과 현재 CAS 값 비교)하여 다르면 에러 반환
→ 저렴하지만 매우 간단하다는 특징