database.sarang.net
UserID
Passwd
Database
DBMS
MySQL
PostgreSQL
Firebird
Oracle
Informix
Sybase
MS-SQL
DB2
Cache
ㆍCUBRID
LDAP
ALTIBASE
Tibero
DB 문서들
스터디
Community
공지사항
자유게시판
구인|구직
DSN 갤러리
도움주신분들
Admin
운영게시판
최근게시물
CUBRID Q&A 556 게시물 읽기
No. 556
Q.트랜잭션 고립수준 문의
작성자
김주희
작성일
2007-09-22 16:48
조회수
3,513

저희 제품에 큐브리드를 사용 할 수 있을지 여부를 테스트 하고 있습니다.

트랜잭션 고립수준 중에 \'READ COMMITTED CLASS WITH READ COMMITTED INSTANCES\'를

테스트 해보았는데요 큐브리드 사용자메뉴얼2에 있는 예제 대로 했지만 메뉴얼의 내용과 다른 결과가 나옵니다.

 

메뉴얼에 따르면 첫번째의 트랜잭션이 Insert Row를 한 뒤에 Commit을 하지 않은 상태에서,

두번째 트랜잭션이 해당 테이블을 조회 하면 첫번째 트랜잭션에서 Insert한 Row는 조회되지 않는다고 했는데요

제가 테스트한 결과는 Row가 조회가 되었습니다. 첫번째 트랜잭션에서 Rollback을 하고나면 두번째 트랜잭션에서

Row가 조회되지 않았습니다. 무엇이 문제인지 모르겠습니다. 아래에 제가 테스트한 순서와 방법을 참조 하셔서

도움을 주셨으면 합니다.

 

 

- 테스트 내용 -

 

 

[첫번째 트랜잭션 에서]

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

   sqlx> ;xrun

   sqlx> ;autocommit off

  

   보신것 처럼 오토커밋을 오프 시키고, 트랜잭션 격리수준을 변경 했습니다.

  

   sqlx> INSERT INTO SER(COL_1) VALUES (1000);

   sqlx> ;xrun

 

   1 rows inserted.

 

   하나의 로우를 Insert하고 commit을 하지 않았습니다.

  

  

[두번째 트랜잭션 에서]  

 

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

   sqlx> ;xrun

   sqlx> ;autocommit off

  

   첫번째 트랜잭션과 같이 오토커밋을 오프 시키고, 트랜잭션 격리수준을 변경 했습니다.

 

   sqlx> SELECT * FROM SER WHERE COL_1 = 1000;

   sqlx> ;xrun

  

   위에서 처럼 조회를 했을 때, 제가 메뉴얼의 내용을 이해한 바로는 해당 로우가 조회 되지

   않아야 하는데요 아래와 같이 조회가 되어 나왔습니다.

  

   === <Result of SELECT Command in Line 1> ===

  

     col_1

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

     1000

  

   1 rows selected.

  

   1 command(s) successfully processed.  

 

 

   위와 같은 결과가 나와서 트랜잭션 격리수준을 변경하는 명령이 제대로 실행 되지 않았나 해서

   큐브리드 매니저의 잠금정보->잠금설정/클라이언트 정보 메뉴에서 ISOLATION 레벨 부분을 확인해

   보았습니다. 확인결과 두개의 클라이언트의 설정이 제가 했던대로

   READ COMMITTED CLASS, READ UNCOMMITTED INSTANCES로 설정되어 있는 것을 확인 할 수 있었습니다.

  

   제가 \'READ COMMITTED CLASS, READ UNCOMMITTED INSTANCES\' 격리 수준에 대해서

   잘못 이해 하고 있는것인지, 제가 한 테스트 방법에 문제가 있는지 알고 싶습니다.

   다시 한 번 도움 부탁 드립니다.

 

이 글에 대한 댓글이 총 1건 있습니다.

안녕하세요.

read committed instance 는 commit 된 instance 만 읽겠다는 의미이며 select 의 경우 테이블에서 관련된 레코드를 스캔하는 동안에 read lock 을 설정합니다. 즉 read lock 을 설정한후 스캔이 완료되면 read lock 을 해제합니다. 따라서 committed instance 인 경우 select 시에 read lock 를 얻어야 하며 다른 트랜잭션이 write lock 를 선점하고 있다면 write lock 이 풀릴때까지 기다릴 것입니다(lock time out 동안)

결국 한쪽에서 입력을 하면 write lock 이 잡히고 다른쪽에서 검색을 하면 read lock 을 잡아야 하는데 write lock 이 잡혀있으므로 기다릴 것입니다. 기본 설정의 경우 lock time out 이 -1 로 무한정 기다리는 것으로 되어있으므로 해당 트랜잭션에서는 결과가 보이지 않은 상태로 계속 있을 것이며, 입력한 쪽에서 commit 이나 rollback 을 해주면 문제의 트랜잭션에서 결과가 있거나(commit시) 없거나(rollback시) 할 것입니다.

 

테스트 하신 부분은 read committed 가 아니고 read uncommitted 로 하셨는데요.

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

이 경우에는 검색시에는 read lock 을 요구하지 않습니다. 따라서 commit 되지 않은 데이터를 읽을 수 있읍니다. 테스트시의 경우를 보면 한쪽에서 insert 를 하였고, 다른 쪽에서 read uncommitted 로 설정후 select 를 하였으므로 read lock 을 요청하지 않았고 따라서 commit 되지 않은 값이 보이는 것입니다. 물론 rollback 을 하면 입력이 취소되었으니 보이지 않는 것이지요.

 

즐거운 추석 보내세요.

 

>저희 제품에 큐브리드를 사용 할 수 있을지 여부를 테스트 하고 있습니다.

>트랜잭션 고립수준 중에 \'READ COMMITTED CLASS WITH READ COMMITTED INSTANCES\'를

>테스트 해보았는데요 큐브리드 사용자메뉴얼2에 있는 예제 대로 했지만 메뉴얼의 내용과 다른 결과가 나옵니다.

>

>메뉴얼에 따르면 첫번째의 트랜잭션이 Insert Row를 한 뒤에 Commit을 하지 않은 상태에서,

>두번째 트랜잭션이 해당 테이블을 조회 하면 첫번째 트랜잭션에서 Insert한 Row는 조회되지 않는다고 했는데요

>제가 테스트한 결과는 Row가 조회가 되었습니다. 첫번째 트랜잭션에서 Rollback을 하고나면 두번째 트랜잭션에서

>Row가 조회되지 않았습니다. 무엇이 문제인지 모르겠습니다. 아래에 제가 테스트한 순서와 방법을 참조 하셔서

>도움을 주셨으면 합니다.

>

>

>- 테스트 내용 -

>

>

>[첫번째 트랜잭션 에서]

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

>   sqlx> ;xrun

>   sqlx> ;autocommit off

>  

>   보신것 처럼 오토커밋을 오프 시키고, 트랜잭션 격리수준을 변경 했습니다.

>  

>   sqlx> INSERT INTO SER(COL_1) VALUES (1000);

>   sqlx> ;xrun

>

>   1 rows inserted.

>

>   하나의 로우를 Insert하고 commit을 하지 않았습니다.

>  

>  

>[두번째 트랜잭션 에서]  

>

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

>   sqlx> ;xrun

>   sqlx> ;autocommit off

>  

>   첫번째 트랜잭션과 같이 오토커밋을 오프 시키고, 트랜잭션 격리수준을 변경 했습니다.

>

>   sqlx> SELECT * FROM SER WHERE COL_1 = 1000;

>   sqlx> ;xrun

>  

>   위에서 처럼 조회를 했을 때, 제가 메뉴얼의 내용을 이해한 바로는 해당 로우가 조회 되지

>   않아야 하는데요 아래와 같이 조회가 되어 나왔습니다.

>  

>   === <Result of SELECT Command in Line 1> ===

>  

>     col_1

>   ======================

>     1000

>  

>   1 rows selected.

>  

>   1 command(s) successfully processed.  

>

>

>   위와 같은 결과가 나와서 트랜잭션 격리수준을 변경하는 명령이 제대로 실행 되지 않았나 해서

>   큐브리드 매니저의 잠금정보->잠금설정/클라이언트 정보 메뉴에서 ISOLATION 레벨 부분을 확인해

>   보았습니다. 확인결과 두개의 클라이언트의 설정이 제가 했던대로

>   READ COMMITTED CLASS, READ UNCOMMITTED INSTANCES로 설정되어 있는 것을 확인 할 수 있었습니다.

>  

>   제가 \'READ COMMITTED CLASS, READ UNCOMMITTED INSTANCES\' 격리 수준에 대해서

>   잘못 이해 하고 있는것인지, 제가 한 테스트 방법에 문제가 있는지 알고 싶습니다.

>   다시 한 번 도움 부탁 드립니다.

 

남재우님이 2007-09-23 02:18에 작성한 댓글입니다. Edit
[Top]
No.
제목
작성자
작성일
조회
559Q.version mismatch문제 해결? [2]
지현우
2007-09-27
3087
558Q.큐브리드 메니저에서 질의 편집기 사용할 때 에러발생 [1]
지현우
2007-09-27
2852
557Q.큐브리드 설치이후 서비스 관련 [1]
김윤환
2007-09-27
2832
556Q.트랜잭션 고립수준 문의 [1]
김주희
2007-09-22
3513
555Q.7.1 윈도우즈 접속 오류 문제... [1]
이규재
2007-09-21
2777
554Q.NOT NULL 제약조건 명령어로 해제하는 방법 (질문) [1]
안성민
2007-09-21
3148
553Q.큐브리드매니져에서 백업자동화가 않됩니다. [1]
사용자
2007-09-21
2778
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2024 DSN, All rights reserved.
작업시간: 0.021초, 이곳 서비스는
	PostgreSQL v16.2로 자료를 관리합니다