오라클 성능 고도화 원리와 해법 I (2009년)
트랜잭션 동시성 제어 0 0 3,571

by 구루비 Concurrency ACID 트랜잭션 [2009.10.28]


II. 트랜잭션과 Lock




오라클은 데이터를 읽을때 Lock을 사용하지 않는다.  그래서 다른 DBMS보다  동시성 측면에서 우월하다고 볼 수 있다.

오라클 10g 부터 대기 이벤트(Wait Event)를 아래와 같이 분류 하였다.



SQL> select wait_class, count( * )
  2  from v$event_name
  3  group by wait_class
  4  order by 1;

WAIT_CLASS                                                         COUNT( * )
\











---\--\--\--\--\--\--\--\--\--\--\- --\--\
-\-
Administrative                                                           46
Application                                                              12
Cluster                                                                  47
Commit                                                                    1
Concurrency                                                              24
Configuration                                                            23
Idle                                                                     62
Network                                                                  26
Other                                                                   588
Scheduler                                                                 2
System I/O                                                               24

WAIT_CLASS                                                         COUNT( * )
\











---\--\--\--\--\--\--\--\--\--\--\- --\--\
-\-
User I/O                                                                 17 12 개의 행이 선택되었습니다.







오라클에서 발생하는 Lock 경합의 대부분을 차지하는 enq : TM - contention 이벤트와 enq : TX - row lock contention 이벤트가
Cuncurrency 가 아닌 Application으로 분류 되어 있다.

 
SQL> select event#, name, wait_class from v$event_name
  2  where name in ('enq: TM - contention','enq: TX - row lock contention');

    EVENT# NAME                           WAIT_CLASS
\








\--\--\--\--\--\--\--\--\--\--   --\--\





--\-
175 enq: TM - contention                 Application

183 enq: TX - row lock contention     Application


대기 이벤트 중 SQL*Net break/reset to client 가 있는데 이것은 사용자가 수행한 SQL문이 존재하지 않는 테이블을 참조 하거나

사용자 정의함수/프로시저에서 처리(catch)하지 않은 에외상황(Exception)을 만났을 때 나타난다.

이것은 DBA이슈가 아닌 개발자 이슈임을 분명히 밝히고 있는 것이다.

근본적인 해법은 Application Logic에서 찾아야 한다.

01 트랜잭션 동시성 제어


(1) 동시성 제어(Concurrency Control)

동시에 실행되는 트랜잭션 수를 최대화 하면서도 입력, 수정, 삭제, 검색시 데이터의 무결성이 유지될 수 있도록 노력하는 것
데이터베이스 어플리케이션은 이들 트랜잭션이 서로 간섭을 일으키는 현상을 최소화 하면서 데이터의 일관성과 무결성이 보장되도록 개발되어야 한다.

그림2-1참조



  • 동시성 (Concurrency) : 다중 사용자가 같은 데이터를 동시에 액세스
  • 일관성 / 정합성 (Consistency): 자신이 발생시킨 변경 사항과 다른 트랜잭션의 변경사항(읽을 수 있는 버전만 허용)을 포함해 일관성 있는 상태로 데이터를 제공

 {*}동시성 제어가 어려운 이유{*}

\- 동시성과 일관성이 트레이트 오프(trade-off) 관계에 있다.

\- 동시성을 높이려고 Lock의 사용을 최소화 하면 읽기 일관성을 유지하기 어렵고, 데이터 일관성을 높이기 위해 Lock을 많이 사용하면 동시성이 떨어진다.(그림참조)







(2) 트랜잭션이란? / 트랜잭션의 특징(ACID)


어떤 업무를 처리하는 최소 단위를 트랜잭션이라 한다.

사전적 의미  [컴퓨터] 트랜잭션 (데이터 파일의 내용에 영향을 미치는 모든 거래)





  • h5. 원자성 (Atomicity)

        : 트랜잭션의 더이상 분해가 불가능한 업무의 최소단위

  • h5. 일관성/정합성 (Consistency)

         : 트랜잭션 실행의 결과로 데이터베이스 상태가 모순되지 않는것

  • h5. 격리성 (Isolation)

          : 트랜잭션이 실행중에 생성하는 연산의 중간 결과는 다른 트랜잭션이 접근 할 수 없는것

  • h5. 영속성 (Durability)

          : 트랜잭션이 일단 실행을 성공적으로 완료하면 결과는 데이터베이스에 영속적으로 저장되는 것




>> 트랜잭션 처리능력이 가장 기본적이고 핵심적인 요소이다.
이 처리 결과가 데이터의 일관성을 해치지 않도록 하기 위해 순차적 진행을 보장하는 직렬화 장치가 Lock 매커니즘 이다.
이에 오라클은 Undo 데이터를 활용한 독특한 읽기 일관성 모델을 사용하고 있다.



 

참조

 위 사용된 Image는 마소7월호에서 발췌하였습니다.



 

"코어 오라클 데이터베이스 스터디 모임" 에서 2009년에 "오라클 성능 고도화 원리와 해법 I " 도서를 스터디하면서 정리한 내용 입니다.

- 강좌 URL : http://www.gurubee.net/lecture/3013

- 구루비 강좌는 개인의 학습용으로만 사용 할 수 있으며, 다른 웹 페이지에 게재할 경우에는 출처를 꼭 밝혀 주시면 고맙겠습니다.~^^

- 구루비 강좌는 서비스 제공을 위한 목적이나, 학원 홍보, 수익을 얻기 위한 용도로 사용 할 수 없습니다.

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입