공부/데이터베이스

데이터 베이스 원리

원클릭쓰리버그 2022. 3. 24. 18:16
728x90

[데이터 베이스]

 

- 데이터를 보다 많이

- 데이터를 좀 더 빠르게

- 데이터를 보다 안전하게.

 

 

데이터 저장은 하드 디스크에 저장되어야 지속적 보관이 가능하다. 하지만, 디스크까지 접근 시 시간적 비용이 많이 들기 때문에 효율성을 위해 여러 방법이 필요하다.

 

 

데이터 베이스 구동 원리

 

 

 

  • 요청 - Client에서 원하는 데이터를 요청한다. (쓰기, 읽기) 이때 버퍼 캐시는 데이터베이스의 서버 쓰레드가 처리하여 빠르게 요청에 대답을 전달한다.
  •  
  • 캐싱 확인 - 만약 메모리(RAM)에 캐싱 되어 있는 상태라면 바로 요청에 응답하지만 캐싱이 안되어 있다면 하드디스크 에 접근한다.
    • 쓰기는 데이터베이스에 접근하기 전 사용자에게 미리 완료여부를 전달한 후, 버퍼캐시에 Task(밀린 쓰기 작업)을 저장한다. 백그라운드 쓰레드가 할당 된 Queue의 일을 다 처리하면, 버퍼캐시에 접근하여 Task를 순차적으로 처리한다. 
    • 읽기는 버퍼캐시를 확인하여, 최근 디스크에서 받아온 데이터를 저장해 놓는다. 만약 없을 경우 디스크에 접근하여 Client에 전달하지만 버퍼캐시에 있을 경우는 RAM 차원에서 빠르게 처리가 가능하다. 버퍼 캐시의 용량이 한정되어 있기 때문에 LRU 알고리즘을 통해 오랫동안 사용하지 않는 데이터를 지속적으로 정리해준다.
  • 검색 및 인출은 데이터베이스에 백그라운드 쓰레드가 처리한다.

 

[Lock]

 

데이터 처리의 순차성을 보장하기 위한 방법.

그리고 중요한 것은 DBMS(Database Management system)마다 Lock을 구현하는 방식과 세부적인 방법이 다르다. 따라서 DBMS를 효과적으로 이용하기 위해서는 해당 DB의 Lock에 대한 이해가 요구됩니다.

 

 

Lock의 종류

 

Lock의 종류

-공유(Shared) Lock (READ 'SELECT')

 

-베타(Exclusive) Lock이 있습니다. (WRITE 'INSERT, UPDATE, DELETE')

 

공유(Shared) Lock

공유 Lock은 데이터를 읽을 때 사용되어지는 Lock이다. 이런 공유 Lock은 공유 Lock 끼리는 동시에 접근이 가능하다. 즉, 하나의 데이터를 읽는 것은 여러 사용자가 동시에 할 수 있다. 하지만 공유 Lock이 설정된 데이터에 베타 Lock을 사용할 수는 없다 -> 공유 Lock과 베타 Lock은 상호 배타적이다..

베타(Exclusive) Lock

베타 Lock은 데이터를 변경하고자 할 때 사용되며, 트랜잭션(데이터베이스의 상태를 변화시키기 해서 수행하는 작업의 단위를 뜻한다)이 완료될 때까지 유지된다. 베타락은 Lock이 해제될 때까지 다른 트랜잭션(읽기 포함)은 해당 리소스에 접근할 수 없다. 또한 해당 Lock은 다른 트랜잭션이 수행되고 있는 데이터에 대해서는 접근하여 함께 Lock을 설정할 수 없다.

 

Lock의 설정 범위(Level)

 

  • 데이터베이스
    • 데이터베이스 범위의 lock은 전체 데이터베이스를 기준으로 lock 하는 것. 즉, 1개의 세션만이 DB의 데이터에 접근이 가능하다. 해당 기능은 일반적으로는 사용하지 않지만, DB의 소프트웨어 버전을 올린다던지 주요한 DB의 업데이트에 사용합니다.
  •  테이블
    • 테이블 수준의 Lock은 테이블을 기준으로 Lock을 설정. 이는 테이블의 모든 행을 업데이트 하는 등의 전체 테이블에 영향을 주는 변경을 수행할 때 유용하다. 즉, 테이블 쓰기 작업 함수인 DDL(create, alter, drop 등) 구문과 함께 사용되며 DDL Lock이라고도 함.
  • 페이지와 블럭
    • 파일의 일부인 페이지와 블록을 기준으로 Lock을 설정한다. 만약 해당 페이지의 Row 작업이 500개가 있다면 Row Lock을 500번 작업하기 보다는 상위의 Page 1곳에 Lock을 설정하면 효율을 증대시킬 수 있다.  
  • 행(Row)
    • 행 수준의 Lock은 1개의 행(Row)를 기준으로 Lock 설정. DML(Data Manipulation Language)에 대한 Lock으로 가장 일반적으로 사용하는 Lock이다.

 

[블로킹(Blocking)]

 

 

블로킹은 베타랑 작업에서 Lock간(베타 - 베타, 베타 - 공유)의 경합이 발생하여 특정 Transaction이 작업을 진행하지 못하고 멈춰선 상태를 말한다. 블로킹을 해소하기 위해서는 이전의 트랜잭션이 완료(커밋 OR 롤백)되어야 한다. 뒤에 들어온 트랜잭션은 이전 트랜잭션이 마무리되어야 이후 진행이 가능하다. 이런 경합은 성능에 좋지 않은 영향을 미치므로 경합을 최소화 할 필요가 있다.

 

DB를 사용하는 프로그래밍을 진행하면서 몇가지 주의사항

  1. 한 트랜잭션의 길이를 너무 길게하는 것.
  2. 처음부터 설계할 때 같은 데이터를 갱신하는 트랜잭션이 동시에 수행되지 않도록 해야한다.
  3. 트랜잭션 격리성 수준을 불필요하게 상향 조정하지 않는다. 
  4. 쿼리를 오랜시간 잡아두지 않도록 적절한 튜닝을 진행한다.

이외에 DBMS에 따라서 lock 대기 시간 등을 설정할 수 있음.

 

 

[DeadLock]

 

 

DeadLock은 두 트랜잭션이 각각 Lock을 설정하고 다음 서로의 Lock에 접근하여 값을 얻어오려고 할 때 이미 각각의 트랜잭션에 의해 Lock이 설정되어 있기 때문에 양쪽 트랜잭션 모두 영원히 처리가 되지않게 되는 상태를 말한다.

 

그래서 DeadLock이 발생하면 DBMS가 둘 중 한 트랜잭션에 에러를 발생시킴으로써 문제를 해결한다. 교착상태가 발생할 가능성을 줄이기 위해서는 접근 순서를 동일하게 하는것이 중요하다. 

 

 

[TRANSACTION]

 

 

  트랜잭션(Transaction 이하 트랜잭션)이란, 데이터베이스의 상태를 변화시키기 해서 수행하는 작업의 단위.

 

특징

 

  • A(Atomigty) 원자성 - 원자 단위로 한번에 일어난다.
  • C(Consistency) 일관성 - 데이터는 항상 같아야 한다. 작업되는 데이터는 꼭 한개에서 이루어져야 한다.
  • I(Isolation) 독립성 - 작업 과정은 독립적 행동한다. 트랜잭션 과정에서 다른 작업이 끼어드는 걸 금지한다. 
  • D(Durability) 지속성 - 영구성이 보장되어야 한다. 만약 데이터 손상이 일어난다면, 복구 가능해야한다.

 

트랜잭션 로그 

 

SQL Server 데이터베이스에는 각 트랜잭션에 의해 적용된 모든 트랜잭션 및 데이터베이스 수정 내용을 기록하는 트랜잭션 로그가 있다. 트랜잭션 로그는 데이터베이스의 중요한 구성 요소이다. 시스템 오류가 발생한 경우 데이터베이스를 일관된 상태로 다시 전환하려면 이 로그가 필요하다.

 

 

트랜잭션의 설명 그림은 아니지만 플로우는 비슷하니 참고하자.

 

 

  • 사용자가 트랜잭션을 요청함. EX) 골드 10개를 소모하여 물약 1개를 구매한다.
  • 데이터 베이스는 버퍼 캐시에 Log를 남김. EX) 골드 -10 , 물약 +1
  • 백그라운드 쓰레드에서 버퍼 캐시를 확인하여 데이터베이스에 작업을 진행. 
    • 전산 오류로 작업이 끊기게 된다면?(Atomigty, Durability 원칙에 위반되는 상황) -> 백그라운드 쓰레드는 버퍼 캐시의 기록을 비교한다. 만약 전산 오류로 골드 -10만 진행이 되었다면, 버퍼 캐시에 남은 물약 +1 작업을 이어서 진행하게 된다.

 

 

 

 

참조

https://sabarada.tistory.com/121

 

[데이터베이스] Lock에 대해서 알아보자 - 기본편

안녕하세요. 오늘은 DataBase의 Lock에 대해서 알아보고 정리해보는 시간을 가져보도록 하겠습니다. DataBase는 데이터를 영속적으로 저장하고 있는 시스템입니다. 이런 시스템은 같은 자원(데이터)

sabarada.tistory.com

https://mommoo.tistory.com/62

 

트랜잭션(Transaction)이란?

트랜잭션이란? 트랜잭션(Transaction 이하 트랜잭션)이란, 데이터베이스의 상태를 변화시키기 해서 수행하는 작업의 단위를 뜻한다. 데이터베이스의 상태를 변화시킨다는 것은 무얼 의미하는 것일

mommoo.tistory.com

https://docs.microsoft.com/ko-kr/sql/relational-databases/logs/the-transaction-log-sql-server?view=sql-server-ver15 

 

트랜잭션 로그(SQL Server) - SQL Server

트랜잭션 로그에 대해 알아봅니다. 모든 SQL Server 데이터베이스는 시스템 오류가 발생할 경우 필요한 모든 트랜잭션 및 데이터베이스 수정 내용을 기록합니다.

docs.microsoft.com

 

'공부 > 데이터베이스' 카테고리의 다른 글

Sorting  (0) 2022.03.24
JOIN의 원리  (0) 2022.03.21
BookMark LoopUp  (0) 2022.03.14
INDEX SCAN vs INDEX SEEK  (0) 2022.03.14
Clustered VS Non-Clustered  (0) 2022.03.11