데이터베이스

세션과 읽기 일관성의 의미, LOCK

야생늑대 2022. 4. 18. 19:22
반응형

세션이란?

  • 데이터베이스 접속을 시작으로 여러데이터베이스에서 관련 작업을 수행한 후 접속을 종료하기까지 전체기간을 의미한다.
  • 그러므로 세션이 여러개라는 말은 현재 오라클 데이터베이스에 접속하여 사용 중인 연결이 여러개 있다는 뜻이다.

 

트랜잭션과 세션의 관계

  • 트랜잭션은 데이터 조작 명령어가 모인 하나의 작업단위를 뜻하며 세션내부에는 하나이상의 트랜잭션이 존재한다.
  • 왜냐하면 데이터베이스에 접속한 후 종료하기까지의 과정이 하나의 세션이고 이 세션이 유지되는 동안 여러번 COMMIT, ROLLBACK 작업이 진행되기 때문이다. 
  • 세션이 트랜젝션보다 큰 범위의 개념이다.

 

읽기 일관성의 중요성

  • 데이터베이스는 여러 곳(여러사용자, 여러 응용프로그램) 에서 동시에 접근하여 데이터를 관리,사용하는 것이 목적이므로 대부분 수많은 세선이 동시에 연결되어 있다.
  • 읽기 일관성이란 어떤 특정 세션에서 테이블의 데이터를 변경 중 일 때 그 외 다른 세션에서는 데이터의 변경이 확정되기 전까지 변경사항을 알 필요가 없으므로, 데이터를 변경 중인 세션을 제외한 나머지 세션에서는 현재 진행 중인 변경과 무관한 본래의 데이터를 보여 주는 특성을 의미한다.
  • 어떤 데이터조작이 포함된 트랜잭션이 종료(COMMIT, ROLLBACK) 되기전까지 데이터를  직접 조작하는 세션 외 다른 세션에서는 데이터 조작 전 상태의 내용이 일관적으로 조회,출력,검색되는 특성읽기 일관성(read consistency) 이라 한다.

※ 데이터베이스 입장에서는 데이터를 변경하는 데이터 조작 명령어 실행 후 COMMIT을 할지, ROLLBACK을 할 지 알수 없기 때문에 ROLLBACK으로  명령어 수행이 취소될 경우에 대비해 변경 전 데이터를 언도 세그먼트(undo segment)에 따로 저장해 둔다.

 

수정 중인 데이터 접근을 막는 LOCK

  • 특정세션에서 조작중인 데이터는 트랜잭션이 완료(COMMIT, ROLLBACK)되기 전까지 다른 세션에서 조작할 수 없는 상태가 된다. 즉, 데이터가 잠기는(LOCK) 것이다.
  • 잠금, 잠금현상으로도 표현하는 LOCK은 조작 중인 데이터를 다른 세션은 조작할 수 없도록 접근을 보류시키는 것을 뜻한다.
  • 특정세션에서 데이터 조작이 완료될 때까지 다른 세션에서 해당 데이터 조작을 기다리는 현상을 HNAG(행) 이라고 한다.
  • 다른 세션에서 데이터 조작 중 일때 데이터 조작명령어를 실행하면 아무 일도 일어나지 않고 화면이 멈춘 듯 가만히 있는다. 그러다 다른세션에서 데이터조작이 끝나고 나면  바로 실행된다.
  • LOCK은 이렇듯 하나의 데이터를 여러 곳에서 동시에 조작하려 할 때 발생할 수 있는 혼란을 최소화하기 위한 중요한 요소이다.

LOCK 종류

  • SQL문으로 조각하는 대상 데이터가 테이블의 특정 행 데이터 일 경우에 해당 행만 LOCK이 발생한다는 의미로 '행 레벨 록(row level lock) 이라고 정의한다.
  • WHERE절을 지정하지 않은 UPDATE, DELETE문일 경우에는 테이블의 모든 행 데이터에 영향을 주는 명령어이므로 이 경우에는 테이블에 지정되어 있는 전체 행이 LOCK상태가 된다.
  • 테이블 전체 행이 LOCK상태여도 INSERT문의 수행은 가능하다.
  • 하지만 테이블에 변경되는 행의 수와는 상관없이 데이터 조작 명령어를 사용하여 데이터가 변경 중인 테이블은 테이블 단위 잠금이라는 의미로 '테이블 레벨 록(TABLE LEVEL LOCK)' 이 걸리게 된다.
  • 데이터 조작 관련 SQL문을 어떤 방식으로 작성하느냐에 따라 테이블의 일부 데이터만 LOCK이 될 수도 있고 테이블 전체 데이터가 LOCK이 될수도 있다는 점을 기억하자.

실무에서는 데이터 관련작업을 할 때 실제 서비스에 사용하는 데이터베이스(운영DB)에 바로 작업하지 않고 대부분 테스트 혹은 개발 전용 데이터베이스에서 시험삼아 테스트 해본 후에 문자가 없으면 실제로 운영 중인 DB에 적용한다.

하지만 이런 테스트, 개발 DB 조차 여러 개발자들이 동시에 사용하고 테스트하면서 진행하기 때문에 SQL문을 실행하고 COMMIT 또는 ROLLBACK을 하지 않은 채 자리를 비운다면, 다른 사용자가 작업 수행에 제한을 받게 된다.

 

 

 

반응형