Open Source RDBMS - Seamless, Scalable, Stable and Free

한국어 | Login |Register

Versions available for this page: CUBRID 8.3.1 |  CUBRID 8.4.0 |  CUBRID 8.4.1 |  CUBRID 8.4.3 |  CUBRID 9.0.0 | 

트랜잭션 지원 및 복구

설명

LOB 데이터 변경에 대한 커밋/롤백을 지원한다. 즉, 트랜잭션 내에서 LOB Locator와 실제 LOB 데이터의 매핑(mapping)에 대한 유효성을 보장하고, 데이터베이스 장애 시 회복(recovery)을 지원한다. 트랜잭션 수행 도중 데이터베이스가 종료되어 해당 트랜잭션이 롤백 처리됨에 따라 LOB Locator와 LOB 데이터 간 매핑이 일치하지 않으면 에러를 출력한다. 아래의 예를 참고한다.

예제

;AUTOCOMMIT OFF

 

CREATE TABLE doc_t (doc_id VARCHAR(64) PRIMARY KEY, content CLOB);

INSERT INTO doc_t VALUES ('doc-10', CHAR_TO_CLOB('This is content'));

COMMIT;

UPDATE doc_t SET content = CHAR_TO_CLOB('This is content 2') where doc_id = 'doc-10';

ROLLBACK;

SELECT doc_id, CLOB_TO_CHAR(content) FROM doc_t WHERE doc_id = 'doc-10';

  doc_id   content                  

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

  'doc-10'  'This is content '

 

INSERT INTO doc_t VALUES ('doc-11', CHAR_TO_CLOB ('This is content'));

COMMIT;

UPDATE doc_t SET content = CHAR_TO_CLOB('This is content 3') WHERE doc_id = 'doc-11';

 

-- system crash occurred and then restart server

SELECT doc_id, CLOB_TO_CHAR(content) FROM doc_t WHERE doc_id = 'doc-11';

 

-- Error : LOB Locator references to the previous LOB data because only LOB Locator is rollbacked.

참고 사항
  • JDBC와 같은 드라이버를 통해 애플리케이션에서 LOB 데이터를 조회하는 경우, JDBC는 데이터베이스 서버로부터 ResultSet을 가져온 후 Resultset에 대해 커서(cursor) 위치를 변경하면서 레코드를 인출할 수 있다. 즉, ResultSet을 가져온 시점에는 LOB 칼럼의 메타 데이터인 Locator만 저장되어 있고, 레코드를 인출하는 시점에 Locator가 참조하는 파일로부터 LOB 데이터가 실제로 인출된다. 따라서, 두 시점 사이에 LOB 데이터가 업데이트되는 경우, LOB Locator와 실제 LOB 데이터의 매핑(mapping)이 유효하지 않아 에러가 발생할 수 있다.
  • LOB 타입 칼럼의 메타 데이터(Locator)에 대해서만 백업/복구를 지원한다. 따라서, 장애가 발생해서 특정 시점으로 복구할 때 LOB Locator와 LOB 데이터의 매핑이 유효하지 않아 에러가 발생할 수 있다.
  • LOB 데이터를 다른 장비에 INSERT하려면 반드시 LOB 칼럼 메타 데이터(Locator)가 참조하는 LOB 데이터를 읽어서 INSERT해야 한다.
  • CUBRID HA에서 LOB 칼럼 메타 데이터(Locator)는 복제되고, LOB 데이터는 복제되지 않는다. 따라서 LOB 타입 저장소가 로컬에 위치할 경우, 슬레이브 노드 또는 failover 이후 마스터 노드에서 해당 칼럼에 대한 작업을 허용하지 않는다.

주의 CUBRID 2008 R3.0 이하 버전에서는 glo(Generalized Large Object) 클래스를 사용하여 Large Object를 처리했으나, CUBRID 2008 R3.1 버전부터는 glo 클래스를 제거하고 BLOB/CLOB 데이터 타입을 지원한다. 따라서, 이전 버전의 glo 클래스를 사용하는 환경에서는 CUBRID 버전 업그레이드를 수행할 때 DB 스키마 및 애플리케이션을 수정해야 한다.