Background Image
기타
2015.05.29 20:46

CUBRID isolation level & Dirty Read

조회 수 11314 추천 수 0 댓글 0
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄

1, CUBRID Isolation level이란

CUBRID는 트랜잭션의 격리 수준(isolation level)을 지정하여 덜 제한적인 일관성(consistency)으로 트랜잭션을 수행하도록 한다, 트랜잭션의 격리수준은 트랜잭션이 동시에 진행중인 다른 트랜잭션에 의해 간섭을 받는 정도를 의미하며 CUBRIDSchemaInstances 조합해 isolation level을 적용한다.

 

2, Dirty Read

CUBRIDcubrid.conf에 설정된 격리수준의 기본값은 REPEATABLE READ CLASS, READ UNCOMMITTED INSTANCES로 데이터를 읽을 때 Dirty read가 발생한다.

Dirty Read T1 트랜잭션에서 읽기하고 실행이 끝나지 않은 상태에서 T2 트랜잭션에 의해 변경된 사항을 보게 되는 경우를 dirty read라고 한다, 만약 T2 트랜잭션에서 그 변경 사항을 rollback하면 그 데이터를 읽은 T1 트랜잭션은 Dirty 데이터를 가지고 있는 것이다.

CUBRIDDirty Read를 방지하기 위해서 아래 CUBRID isolation level 표를 확인해 isolation 변경이 필요하다.

  • INSTANCES isolation Level Dirty Read 결과표

Isolation Level

T2Commit/Rollback 수행할 경우 결과

T2Commit/Rollback 수행하지 않을 경우 결과

READ UNCOMMITTED INSTANCES

가능

가능

READ COMMITTED INSTANCES

불가능

불가능

REPEATABLE READ INSTANCES

불가능

불가능

SERIALIZABLE

불가능

불가능


3, isolation level 환경 설정

CUBRID isolation level 기본설정 값은 REPEATABLE READ CLASS, READ UNCOMMITTED INSTANCEScubrid.confisolation_level로 파라미터로 환경 설정이 가능하고 변경한 설정은 데이터베이스 서버 재구동 후 isolation level(격리수준)이 반영된다.

$>vi $CUBRID/conf/cubrid.conf

isolation_level = 1

à 격리수준 변경은 아래 표를 참조해 설정한다.

  • CUBRID isolation level 정리표

CUBRID 격리수준 (isolation_level)

DBMS 격리 수준

더티 읽기

조회 중인 테이블에 대한 스키마 갱신

SERIALIZABLE (6)

SERIALIZABLE

X

X

REPEATABLE READ CLASS with REPEATABLE READ INSTANCES (5)

REPEATABLE READ

X

X

REPEATABLE READ CLASS with READ COMMITTED INSTANCES (4)

READ COMMITTED

X

X

REPEATABLE READ CLASS with READ UNCOMMITTED INSTANCES (3)

READ UNCOMMITTED

O

X

READ COMMITTED CLASS with READ COMMITTED INSTANCES (2)

-

X

O

READ COMMITTED CLASS with READ UNCOMMITTED INSTANCES (1)

-

O

O


4, 트랜잭션별 격리수준 설정과 확인

csql 인터프린터에서 다음과 같이 스키마와 Instances를 콤마(,) 구분하여 변경한다.

구문: SET TRANSACTION ISOLATION LEVEL isolation_level_spec

csql>SET TRANSACTION ISOLATION LEVEL REPEATABLE READ CLASS, REPEATABLE READ INSTANCES;

csql>SET TRANSACTION ISOLATION LEVEL READ COMMITTED CLASS, READ UNCOMMITTED INSTANCES;

현 트랜잭션 isolation level 값을 얻고자 할 경우 GET TRANSACTION 문을 이용해 아래와 같이 얻을 수 있다.

구문: GET TRANSACTION ISOLATION LEVEL

csql> GET TRANSACTION ISOLATION LEVEL

csql> ;x

=== <Result of GET ISOLATION LEVEL Command in Line 2> ===

       Result

=============

  READ COMMITTED SCHEMA, READ UNCOMMITTED INSTANCES


5, JAVA 프로그램 트랜잭션 격리수준 변경

데이터베이스 읽기 수행 시 Dirty Read 방지가 필요하다면 isolation levelREAD COMMITTED INSTANCES 편경해야 한다, 하지만 데이터베이스 전체의 격리수준을 높일 경우 서비스에 성능적인 영향을 크게 받을 수 있다, 이런 상황에서는 서비스 영향에 따라 특정 트랜잭션이나 질의만을 선택적으로 Dirty Read가 발생되지 않도록 conn.setTransactionIsolation(); 함수로 isolation level을 조정해  Dirty Read를 방지할 수 있다.

Ex) JAVA 프로그램 conn.setTransactionIsolation(); 함수 사용예제

import java.sql.*;

public class SelectData {

   public static void main(String[] args) throws Exception {

       Connection conn = null;

       Statement stmt = null;

       ResultSet rs = null;

       ResultSet ri = null;

       try {

       Class.forName("cubrid.jdbc.driver.CUBRIDDriver");

       conn = DriverManager.getConnection("jdbc:cubrid:localhost:30000:demodb:::","dba","");

        System.out.println("conn_isolation_level-->" + conn.getTransactionIsolation());

        conn.setTransactionIsolation(2);   // isolation level à COMMITTED INSTANCES 변경

        System.out.println("set_isolation_level-->" + conn.getTransactionIsolation());

       String sql = "select name from event where rownum=1";

       stmt = conn.createStatement();

       rs = stmt.executeQuery(sql);

       while(rs.next()) {

           String name = rs.getString("name");

           System.out.println("");

           System.out.println("============================================");

           System.out.println("name ==> " + name);

           System.out.println("============================================");

           System.out.println("");

       }

        conn.setTransactionIsolation(1);  // isolation level à UNCOMMITTED INSTANCES 원복

       rs.close();

       stmt.close();

       conn.close();

       } catch ( SQLException e ) {

           System.err.println(e.getMessage());

       } catch ( Exception e ) {

           System.err.println(e.getMessage());

       } finally {

           if ( conn != null ) conn.close();

       }

   }

}


참조1: conn.setTransactionIsolation(); 함수로 변경된 트랜잭션은 CAS 프로세서가 변경된 isolation level을 유지하기 때문에 WASconnection pool을 사용할 경우는 반드시 conn.setTransactionIsolation(); 함수로 현재 설정된 isolation level로 원복이 필요하다.


참조2: conn.setTransactionIsolation 설정값과 격리수준은 다음과 같다.

setTransactionIsolation(1): REPEATABLE CLASSES AND READ UNCOMMITTED INSTANCES

setTransactionIsolation(2): REPEATABLE CLASSES AND READ COMMITTED INSTANCES

setTransactionIsolation(3): Unknown transaction isolation level

setTransactionIsolation(4): REPEATABLE CLASSES AND REPEATABLE INSTANCES





List of Articles
번호 분류 제목 글쓴이 날짜 조회 수
77 기타 자주 발생하는 큐브리드(cubrid) 에러 메시지 정리 admin 2011.07.14 81426
76 기타 [주의사항] CUBRID에서의 BLOB/CLOB 사용시 백업 및 복구에 대한 주의 점 admin 2011.07.14 52783
75 기타 connect by 구현 방법 admin 2009.04.01 52374
74 기타 오라클 개발자를 위한 CUBRID 개발 안내 1 admin 2009.04.01 49822
73 기타 CUBRID 활용 - 질의 튜닝 사례 중심 file cubrid 2010.12.02 45962
72 기타 CUBRID 개발 로드맵 admin 2008.12.27 40321
71 기타 MD5 암호화 모듈 file admin 2008.11.21 38593
70 기타 데이터 저장 구조와 테이블 재구성 file 손승일 2010.04.21 37490
69 기타 CUBRID와 타 데이터베이스 기능 비교 9 admin 2008.11.21 36163
68 기타 자동증가 속성 사용 방법 및 주의 사항 남재우 2010.02.26 35685
67 기타 CUBRID 2008 + XE 설치 가이드 [R1.x] Prototype 2009.03.13 34326
66 기타 CUBRID 관련 유용한 기술 자료... 정병주 2010.02.19 33462
65 기타 제로보드 XE 사용하기 file admin 2008.11.21 33068
64 기타 CUBRID 데이터베이스와 연동하여 Qt어플리케이션 개발하기 - 1 김대진 2010.01.14 32878
63 기타 대량의 데이터 입력 방법 admin 2008.11.21 32655
62 기타 CUBRID 매니저 R3.1에서 웹호스팅 서버의 CUBRID R2.1 접속하는 방법 (큐브리드 매니저에서 다른 버전의 큐브리드 서버 접속 방법) file admin 2011.07.14 31507
61 기타 CUBRID 2008 주요 명령어 admin 2008.11.21 30806
60 기타 CUBRID Migration Toolkit 튜토리얼 file cubrid 2010.10.22 30477
59 기타 CUBRID에서의 BLOB/CLOB 타입 사용법 cubebridge 2011.03.08 30447
58 기타 CUBRID 복제 구성하기 - 단일 서버에 구성 방법 포함 남재우 2010.03.08 30004
Board Pagination Prev 1 2 3 4 Next
/ 4

Contact Cubrid

대표전화 070-4077-2110 / 기술문의 070-4077-2113 / 영업문의 070-4077-2112 / Email. contact_at_cubrid.com
Contact Sales