TIL 220915

강지훈·2022년 9월 14일
0

[격리성과 격리수준에 따른 현상]
격리 수준은 serializable, repeatable_read,read_committed, read_uncommited 가 있으며 위로 갈수록 동시성이 강해지지만 격리성은 약해지고, 아래로 갈수록 동시성은 약해지고 격리성은 강해집니다. 예를 들어 serializable은 격리성이 강한대 반해, 동시성은 약합니다. 또한 각 단계마다 나타나는 형상이 있습니다.
repeatable_read는 팬텀리드, read_committed는 팬텀 리드 , 반복 가능하지 않은 조회가 발생하며, read_uncommitted는 팬텀리드, 반복 가능하지 않은 조회, 더티 리드가 발생할 수도 있습니다. 격리 수준에 따라 발생하는 현상
격리 수준에 따라 발생하는 현상은 팬텀 리드, 반복 가능하지 않은 조회, 더티 리드가 있습니다.

팬텀 리드
팬텀 리드(phantom read)는 한 트랜잭션 내에서 동일한 쿼리를 보냈을 때
해당 조회 결과가 다른 경우를 말합니다.
예를 들어 사용자 A가 회원 테이블에서 age가 12이상인 회원들을 조회하는 쿼리를 보낸다고 해봅시다. 이 결과로 세 개의 테이블이 조회한다고 해보죠. 그다음 사용자 B가 age가 15인 회원 레코드를 삽입합니다. 그러면 그 다음 세 개가 아닌 네 개의 테이블이 조회되는 것이죠.

반복 가능하지 않은 조회
반복 가능하지 않은 조회(non-repeatable read)는 한 트랜잭션 내의 같은 행에 두 번 이상 조회가 발생했는데, 그 값이 다른 경우를 가리킵니다. 예를 들어 사용자 A가 큰돌의 보석 개수가 100개라는 값을 가진 데이터 였는데, 그 이후 사용자 B가 그 값을 1로 변경해서 커밋했다고 하면 사용자 A는 100이 아닌 1을 읽게 됩니다.
팬텀 리드와 다른 점은 반복 가능하지 않은 조회는 행 값이 달라질 수도 있는데, 팬텀 리드는 다른 행이 선택될 수도 있다는 것을 의미합니다.

더티 리드
더티 리드(dirty read)는 반복 가능하지 않은 조회와 유사하며 한 트랜잭션이 실행 중일 때 다른 트랜잭션에 의해 수정되었지만 아직 '커밋되지 않은' 행의 데이터를 읽을 수 있을 때 발생합니다.
예를 들어 사용자 A가 큰돌의 보석 개수 100을 1로 변경한 내용이 '커밋되지 않은' 상태라도 그 이후 사용자 B가 조회한 결과가 1로 나오는 경우를 말합니다.

격리수준
serializable
serializable은 말 그대로 트랜잭션을 순차적으로 진행시키는 것을 말합니다. 여러 트랜잭션이 동시에 같은 행에 접근할 수 없습니다.
이 수준은 매우 엄격한 수준으로 해당 행에 대해 격리시키고, 이후 트랜잭션이 이 행에 대해 일어난다면 기다려야 합니다. 그렇게 때문에 교착 상태가 일어날 확률도 많고 가장 성능이 떨어지는 격리 수준입니다.

repeatable_read
repeatable_read는 하나의 트랜잭션이 수정한 행을 다른 트랜잭션이 수정할 수 없도록 막아주지만 새로운 행을 추가하는 것은 막지 않습니다. 따라서 이후에 추가된 행이 발견될 수도 있습니다.

read_committed
read_committed는 가장 많이 사용되는 격리 수준이며 mysql 8.0, postgresql, sql server, 오라클에서 기본값으로 설정되어 있습니다
read_uncommtted와는 달리 다른 트랜잭션이 커밋하지 않은 정보는 읽을수 없습니다. 즉 커밋 완료된 데이터에 대해서만 조회를 허용합니다.
하지만 어떤 트랜잭션이 접근한 행을 다른 트랜잭션이 수정할 수 있습니다.
예를 들어 트랜잭션 A가 수정한 행을 트랜잭션 B가 수정할 수도 있습니다
이 때문에 트랜잭션 A가 같은 행을 다시 읽을 때 다른 내용이 발견될 수 있습니다.

read_uncommiited
read_uncommiited는 가장 낮은 격리 수준으로, 하나의 트랜잭션이 커밋되기 이전에 다른 트랜잭션에 노출되는 문제가 있지만 가장 빠릅니다.
이는 데이터 무결성을 위해 되도록이면 사용하지 않는 것이 이상적이나, 몇몇 행이 제대로 조회되지 않더라도 괜찮은 거대한 양의 데이터를 '어림잡아' 집계하는 데는 사용하면 좋습니다.

[관계형 데이터베이스와 NoSQL 데이터베이스의 차이]
관계형 데이터베이스
관계형 데이터베이스(RDBMS)는 행과 열을 가지는 표 형식 데이터를 저장하는 형태의 데이터베이스를 다리키며 SQL이라는 언어를 써서 조작합니다.
MySQL,PostgreSQL,오라클,SQL Server, MSSQL 등이 있습니다.
참고로 관계형 데이터베이스의 경우 표준 SQL은 지키기는 하지만, 각각의 데품에 특화시킨 SQL을 사용합니다. 예를들어 오라클의 경우 PL/SQL이라고 하며 SQL Server에서는 T-SQL, MySQL은 SQL을 씁니다.

NoSQL 데이터베이스
NoSQL (Not only SQL)이라는 슬로건에서 생겨난 데이터베이스입니다. SQL을 사용하지 않는 데이터베이스를 말하며 유연한 스키마, 확장성이 특징입니다.
대표정으로 MongoDB와 redis 등이 있습니다.

MySQL은 대부분의 운영체제와 호환되며 현재 가장 많이 사용하는 데이터베이스 입니다.

PostgreSQL
PostgreSQL 은 MySQL 다음으로 개발자들이 선호하는 데이터베이스 기술로 널리 인정받고 있습니다.

MongoDB는 JSON을 통해 데이터에 접근할 수 있고, Binary JSON 형태(BSON)로 데이터가 저장되며 와이어드타이거 엔진이 기본 스토리지 엔진으로 장착된 키-값 데이터 모델에서 확장된 도큐먼트 기반의 데이터베이스입니다. 확장성이 뛰어나며 빅데이터를 저장할 때 성능이 좋고 고가용성과 샤딩, 레플리카셋을 지원합니다.
또한, 스키마를 정해 놓지 않고 데이터를 삽입할 수 있기 때문에 다양한 도메인의 데이터베이스를 기반으로 분석하거나 로깅 등을 구현할 대 강점을 보입니다.
또한 MongoDB는 도큐먼트를 생성할 때마다 다른 컬렉션에서 중복된 값을 지니기 힘든 유니크한 값인 ObjectID가 생성됩니다.
이는 기본키로 유닉스 시간 기반의 타임스탬프, 랜덤값, 카운터로 이루어져 있습니다.

1.key와 value 형태의 도큐먼트
MongDB 내의 도큐먼트는 key-value 형태로 이루어지며 _id 라는 고유한 아이디를 가집니다. 그리고 DB에 저장될 때 key의 길이도 내용으로 들어갑니다.
또한 MongDB는 JSON 형태로 쿼리를 만들고 JSON을 매개변수로 받아 BSON 형태로 DB에 삽입, 추출하는 것이 가능합니다.
그래서 type 변환이 일어나지 않으며, 이를 통해 JSON 데이터를 주고 받을 때 성능 면에서 더 좋은 선택이 됩니다. >> 자바스크립트 풀스택 아키텍처에 장점

  1. 스키마 없이 삽입 가능, BUT?
    MongoDB는 RDBMS와 달리 스키마 없이 데이터 모델을 구현하지 않은 채 유동적으로 데이터를 삽입할 수 있습니다. 스키마란 데이터베이스를 구성하는 속성, 관계 등 데이터 값이 갖는 type을 명시해놓은 것을 말합니다. 이를 통해 다양한 서비스로 부터 데이터를 유동적으로 쌓을 수 있는 장점을 갖게 됩니다.
    하지만 스키마를 미리 설정해놓고 DB에 저장하는 RDBMS는 칼럼의 길이가 DB에 저장되지 않지만 MongoDB는 다릅니다. 예를 들어 RDBMS인 경우 어떤 한 스키마가 int, char[14]인 경우 그 안에 들어가는 데이터인 18바이트만 저장되지만,
    MongoDB는 한 도큐먼트로 칼럼이름도 바이트에 추가됩니다. key-value 형태로 들어가기 때문이죠. 예를들어 comments: string 이란 type으로 정해놓고 DB 에 저장한다면 comments라는 길이의 byte, 즉 8byte가 각각 더 들어가게 됩니다.

3.데이터의 조합함수 지원
MongoDB는 min,max,aggregate,mapReduce 등 강력한 함수로 데이터를 추출하고 조합해서 압축된 결괏값을 만들어낼 수 있습니다.

  1. 이중화 지원과 샤딩
    서버는 멈추면 안 되기 때문에 운영서버의 경우 서버 이중화를 합니다
    이때 MongoDB는 ReplicaSet을 이용해 이중화를 가능하게 합니다. 또한 데이터의 양이 많은 경우 샤딩을 통해 collection을 분할해 관리할 수 있습니다.

  2. JSON 형태의 Data
    MongoDB는 BSON 형태로 저장되며 JSON 형태의 값으로 추출해낼 수 있습니다.
    또한 JSON Object를 매개변수로 받아 쉽게 저장할 수 있습니다.

  3. 2차원 좌표 인덱싱
    MongoDB는 geoSpartial이란 인덱스를 써서 2차원 좌표를 인덱싱할 수 있습니다.

  4. collection join
    MongoDB 는 $lookup을 통한 collection join이 가능합니다.

  5. B-tree를 적용한 인덱싱
    무언가를 찾고자 할 때 사용되는 것이 인덱싱입니다. 인덱싱이 있어야 빠르게 데이터를 찾ㅇ르 수 있습니다. 인덱스의 기본 정렬은 항상 오름차순으로 구현되지만 데이터를 추출할 때 또는 인덱스를 초기에 설정할 때는 오름차순이나 내림차순으로 변경할 수 있습니다. 인덱스는 B-tree로 구성되어 있고, 앞서 설명한 2차원 좌표 인덱싱의 경우 R-tree로 구성되어 있습니다.

redis
redis는 인메모리 데이터베이스이자 키-값 데이터모델 기반의 데이터베이스입니다.

기본적인 데이터 타입은 문자열(string)이며 최대 512MB 까지 저장할 수 있습니다
이외에도 셋(set), 해시(hash) 등을 지원합니다
pub/sub 기능을 통해 채팅 시스템, 다른 데이터베이스 앞단에 두어 사용하는 캐싱 계층, 단순한 키-값이 필요한 세션 정보 관리, 정렬된 셋(sorted set) 자료 구조를 이용한 실시간 순위표 서비스에 사용합니다.

profile
never stop

0개의 댓글