트랜잭션
- 트랜잭션은 커넥션 단위로 수행합니다. 하지만 매번 이를 넘겨주기 어렵습니다.
메소드의 호출을 하나의 트랜잭션에 묶이도록 하는것을 트랜잭션 전파 합니다.
커밋과 롤백
- 커밋은 여러 쿼리가 성공적으로 처리되었다고 확정하는 명령어 입니다. 트랜잭션 단위로 수행되며 변경된 내용이 모두 영구적으로 저장되는 것을 말합니다.
- 롤백은 여러 이슈 때문에 트랜잭션전 으로 처리한 하나의 묶음 과정이 일어나기 전으로 되돌리는 일을 말합니다.
ACID
- 일관성
- 허용된 방식으로만 데이터를 변경하는 것을 의미합니다.
- 격리성
- 트랜잭션 수행 시 서로 끼어들지 못하는 것을 말합니다.
- 지속성
- 성공적으로 수행된 트랜잭션은 영원히 반영되어야 하는 것을 의미합니다.
- 원자성
- all or Nothing
SERIALIZABE
트랜잭션을 순차적으로 진행 시키는 것을 말합니다.
여러 트랜잭션이 동시에 같은 행에 접근 할 수 없습니다.
REPEATABLE_READ
하나의 트랜잭션이 수정한 행을 다른 트랜잭션이 수정할 수 없도록 막아줍니다.
하지만 새로운행을 추가하는것은 막지 않습니다.
READ_COMMITED
커밋 완료된 데이터에 대해서만 조회를 허용합니다.
하지만 어떤 트랜잭션이 접근한 행을 다른 트랜잭션이 수정할 수 있습니다.
그렇기때문에 트랜잭션 A가 같은 행을 다시 읽을때 다른 내용이 발견 될 수 있습니다.
READ_UNCOMMITED
트랜잭션이 커밋되기 이전에 다른 트랜잭션에 노출되는 문제가 있지만 가장 빠릅니다.
phantom read
트랜잭션 내에서 동일한 쿼리를 보냈을 때, 해당 조회 결과가 다른 경우를 말합니다.
non-repeatable read
트랜잭션 내의 같은 행에 두번 이상 조회가 발생했는데, 그 값이 다른 경우를 가리킵니다.
dirty read
트랜잭션이 실행 중일 때 다른 트랜잭션에 의해 수정되었지만, 아직 '커밋되지 않은' 행의 데이터를 읽을수 있을때발생합니다.
[! B-tree란 ? ]
루트 노드, 브랜치 노드, 리프노드로 구성된 트리입니다.
특정 데이터 탐색시에 각 노드에서 특정 범위를 탐색하여 빠르게 탐색이 가능합니다.
클러스터형 인덱스
세컨더리 인덱스
인덱스는 특정 key를 트리구조로 생성 해놓고 각 리프노드의 주소가 가리키는 값이 실질적인 디스크(DB테이블)에 매핑 됩니다.
모든 필드를 인덱스로 지정하면 테이블을 하나 더 만들어 놓는것 과 같다고 생각합니다.
우리는 최적의 인덱스를 잘 조절해야 합니다.
왼쪽 테이블과 오른쪽 에티블의 두행이 모두 일치하는 행이 있는 부분만 표기
왼쪽 테이블의 모든 행이 결과 테이블에 표기 됩니다.
오른족 테이블의 모든 행이 결과 테이블에 표기 됩니다.
두개의 테이블을 기반으로 조인 조건에 만족 하지 않는 행까지 모두 표기합니다.
중첩 for 문과 같은 원리로 조건에 맞는 조인을 하는 방법
조인할 필드 기준으로 정렬하고 정렬이 끝난 이후에 조인 작업을 수행하는 조인입니다.
해시테이블 기반으로 조인하는 방법입니다.
조인 테이블들의 일부의 테이블의 데이터가 메모리에 올라 갈 정도가 되어야 최적의 효율을 볼 수 있습니다.