From 2be9d9d29a5b0c4ea3ee0ab619d22861888e620d Mon Sep 17 00:00:00 2001 From: "jina.kim" <> Date: Mon, 18 Mar 2024 15:20:23 +0900 Subject: [PATCH 1/8] =?UTF-8?q?INC-48302=20lob=20select=20=EC=A3=BC?= =?UTF-8?q?=EC=9D=98=20=EC=82=AC=ED=95=AD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit INC-48302 lob select 주의 사항 --- .../Altibase_trunk/kor/CLI User's Manual.md | 32 +++++++++++-------- .../Altibase_trunk/kor/JDBC User's Manual.md | 12 ++++--- 2 files changed, 26 insertions(+), 18 deletions(-) diff --git a/Manuals/Altibase_trunk/kor/CLI User's Manual.md b/Manuals/Altibase_trunk/kor/CLI User's Manual.md index 4d4ce8952..2cc5cfb6f 100644 --- a/Manuals/Altibase_trunk/kor/CLI User's Manual.md +++ b/Manuals/Altibase_trunk/kor/CLI User's Manual.md @@ -6899,13 +6899,18 @@ SQLTransact(SQL_NULL_HENV, dbc, SQL_COMMIT); ### LOB 데이터 처리 방식 -#### LOB 위치 입력기(LOB Locator) +Altibase는 CLI에서 LOB데이터를 처리하기위해 LOB Locator를 이용한다. Lob Locator는 LOB 데이터를 가리키는 Altibase 서버의 내부 자료구조로, 운영체제의 파일 포인터와 유사하다. LOB 데이터를 연산하기 위해서는 먼저 LOB Locator를 획득해야 하며, 이를 통해 LOB 데이터를 읽거나 쓸 수 있다. LOB Locator는 MVCC와 관련하여 특정 시점의 LOB 데이터를 가리키기 때문에, LOB Locator를 발생시킨 트랜잭션과 생명주기를 같이하며, 그 트랜잭션에 종속된다. -CLI의 일부 함수에서 LOB 데이터를 처리할 때 LOB 위치 입력기를 사용하기 때문에 LOB 위치 입력기를 이용한 LOB 데이터 처리 방식에 대한 이해가 필요하다. +#### 자동 커밋 모드 해제 + +LOB 위치 입력기는 트랜잭션에 종속적이기 때문에 **CLI에서 LOB 위치 입력기를 이용하여 LOB 데이터를 처리하려면 반드시 자동 커밋 모드를 해제해야 한다.** + +자동 커밋 모드를 해제하면 LOB 위치 입력기를 얻어오는 CLI 함수와 LOB 데이터를 읽고 쓰는 CLI 함수는 하나의 트랜잭션에서 개별 작업이 되어 LOB 위치 입력기를 공유할 수 있다. 반면, 자동 커밋 모드에서는 각각의 개별 트랜잭션으로 동작하기 때문에 두 트랜잭션 간에 LOB 위치 입력기를 공유할 수 없다. -LOB 위치 입력기는 LOB 데이터를 가리키는 Altibase 서버의 내부 자료구조이며 트랜잭션에 종속된다. +> **LOB 위치 입력기를 이용한 트랜잭션 커밋 시 주의사항** -CLI에서 LOB 데이터를 처리하는 과정은 LOB 위치 입력기를 얻는 작업과 LOB 위치 입력기를 이용하여 LOB 데이터를 읽고 쓰는 작업으로 나뉜다. +1. 자동 커밋 해제 모드에서 LOB 데이터를 읽고 쓰는 CLI 함수 수행 중 예상치 못한 에러가 발생하면, 내부적으로 초기화된 데이터가 남아 있을 수 있어 **반드시 트랜잭션을 롤백해야 한다.** +2. NOT NULL 제약이 있는 LOB 타입 컬럼에 NULL 값을 INSERT 혹은 UPDATE 수행하면 [Unable to insert (or update) NULL into NOT NULL column.] 에러가 발생한다. 이 경우 초기화된 데이터가 남아 있어 **반드시 트랜잭션을 롤백해야 한다.** #### LOB 위치 입력기 얻기 @@ -6927,16 +6932,15 @@ LOB 위치 입력기를 얻은 후에 이것을 이용하여 LOB 데이터를 - SQLPutLob - SQLTrimLob -#### 자동 커밋 모드 해제 - -LOB 위치 입력기는 트랜잭션에 종속적이기 때문에 **CLI에서 LOB 위치 입력기를 이용하여 LOB 데이터를 처리하려면 반드시 자동 커밋 모드를 해제해야 한다.** +#### LOB 데이터의 조회(SELECT) -자동 커밋 모드를 해제하면 LOB 위치 입력기를 얻어오는 CLI 함수와 LOB 데이터를 읽고 쓰는 CLI 함수는 하나의 트랜잭션에서 개별 작업이 되어 LOB 위치 입력기를 공유할 수 있다. 반면, 자동 커밋 모드에서는 각각의 개별 트랜잭션으로 동작하기 때문에 두 트랜잭션 간에 LOB 위치 입력기를 공유할 수 없다. +LOB 데이터를 SELECT 할때, 내부적으로는 LOB Loctor를 얻어와서 처리되기 때문에 연관된 트랜잭션이 열린 상태가 된다. 따라서 사용자는 명시적으로 commit 또는 rollback과 같은 트랜잭션 종료 작업을 추가로 해주어야 한다. -> **LOB 위치 입력기를 이용한 트랜잭션 커밋 시 주의사항** +> [!CAUTION] +> +> 만약, 사용자가 명시적으로 commit 또는 rollback 과 같은 트랜잭션 종료 작업을 하지 않으면, 데이터베이스의 메모리 사용량이 증가할 수 있다. -1. 자동 커밋 해제 모드에서 LOB 데이터를 읽고 쓰는 CLI 함수 수행 중 예상치 못한 에러가 발생하면, 내부적으로 초기화된 데이타가 남아 있을 수 있어 **반드시 트랜잭션을 롤백해야 한다.** -2. NOT NULL 제약이 있는 LOB 타입 컬럼에 NULL 값을 INSERT 혹은 UPDATE 수행하면 [Unable to insert (or update) NULL into NOT NULL column.] 에러가 발생한다. 이 경우 초기화된 데이터가 남아 있어 **반드시 트랜잭션을 롤백해야 한다.** +#### 자원 해제하기 ### LOB 데이터 타입 @@ -7090,7 +7094,7 @@ CREATE TABLE T1 (i1 INTEGER PRIMARY KEY, i2 BLOB); ##### 한 개의 LOB을 파일에 쓰기 -``` +```c SQLCHAR fileName[16]; SQLLEN fileNameLength = 15; SQLUINTEGER fileOptions = SQL_FILE_CREATE; @@ -7132,7 +7136,7 @@ else ##### 세 개의 LOB을 파일에 쓰기 -``` +```c SQLCHAR fileName[3][10]; SQLLEN fileNameLength[3]; SQLUINTEGER fileOptions[3]; @@ -7192,7 +7196,7 @@ else ##### n개의 LOB을 파일에 쓰기 -``` +```c SQLCHAR fileName[11]; SQLLEN fileNameLength = 10; SQLUINTEGER fileOptions = SQL_FILE_OVERWRITE; diff --git a/Manuals/Altibase_trunk/kor/JDBC User's Manual.md b/Manuals/Altibase_trunk/kor/JDBC User's Manual.md index 2dccd6500..d0a1c1f5a 100644 --- a/Manuals/Altibase_trunk/kor/JDBC User's Manual.md +++ b/Manuals/Altibase_trunk/kor/JDBC User's Manual.md @@ -3028,11 +3028,14 @@ while(sRs.next()) ##### BLOB 데이터 읽기 +LOB 데이터를 읽을 때, 내부적으로는 Lob Locator를 이용하기 때문에 반드시 commit 또는 rollback과 같은 명시적인 트랜잭션 종료 작업을 추가해야 한다. + ###### 1. InputStream 객체와 getBinaryStream 메소드를 사용한 방법 -``` +```java ... -PreparedStatement sPstmt = connection().prepareStatement("SELECT BLOB_COLUMN +sCon = getConnection(); +PreparedStatement sPstmt = sCon.prepareStatement("SELECT BLOB_COLUMN FROM BLOB_TABLE"); ResultSet sRs = sPstmt.executeQuery(); while(sRs.next()) @@ -3042,13 +3045,14 @@ while(sRs.next()) ... } ... +sCon.commit(); ``` ###### 2. getBlob 메소드와 InputStream 객체를 사용한 방법 -``` +```java ... PreparedStatement sPstmt = connection().prepareStatement("SELECT BLOB_COLUMN FROM BLOB_TABLE"); @@ -3067,7 +3071,7 @@ while(sRs.next()) ###### 3. getBlob 메소드와 byte 배열을 사용한 방법 -``` +```java ... final int sReadLength = 100; From a214d9ef1bacfb69b6412e0756c6784286f7429b Mon Sep 17 00:00:00 2001 From: "jina.kim" <> Date: Mon, 18 Mar 2024 16:21:36 +0900 Subject: [PATCH 2/8] Update CLI User's Manual.md MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 리뷰내용 추가합니다. --- Manuals/Altibase_trunk/kor/CLI User's Manual.md | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/Manuals/Altibase_trunk/kor/CLI User's Manual.md b/Manuals/Altibase_trunk/kor/CLI User's Manual.md index 2cc5cfb6f..c47d47b87 100644 --- a/Manuals/Altibase_trunk/kor/CLI User's Manual.md +++ b/Manuals/Altibase_trunk/kor/CLI User's Manual.md @@ -6942,6 +6942,13 @@ LOB 데이터를 SELECT 할때, 내부적으로는 LOB Loctor를 얻어와서 #### 자원 해제하기 +LOB 데이터와 관련한 작업이 완료된 경우, 관련된 자원을 해제해주어야 한다. 관련 CLI 함수는 아래와 같다. + +* SQLFreeLob +* SQLEndTran + +SQLFreeLob 함수는 Lob Locator와 관련된 자원을 해제할 뿐, 트랜잭션을 종료하지는 않는다. + ### LOB 데이터 타입 LOB 데이터 타입을 처리하는데 사용되는 SQL 데이터 타입과 C 데이터 타입을 소개한다. From c59d096b686fa056e8643144bff59bcca96266d5 Mon Sep 17 00:00:00 2001 From: jina-altibase <43777901+jina-altibase@users.noreply.github.com> Date: Tue, 19 Mar 2024 13:17:04 +0900 Subject: [PATCH 3/8] Update Manuals/Altibase_trunk/kor/CLI User's Manual.md --- Manuals/Altibase_trunk/kor/CLI User's Manual.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Manuals/Altibase_trunk/kor/CLI User's Manual.md b/Manuals/Altibase_trunk/kor/CLI User's Manual.md index c47d47b87..e8195d9bc 100644 --- a/Manuals/Altibase_trunk/kor/CLI User's Manual.md +++ b/Manuals/Altibase_trunk/kor/CLI User's Manual.md @@ -6934,7 +6934,7 @@ LOB 위치 입력기를 얻은 후에 이것을 이용하여 LOB 데이터를 #### LOB 데이터의 조회(SELECT) -LOB 데이터를 SELECT 할때, 내부적으로는 LOB Loctor를 얻어와서 처리되기 때문에 연관된 트랜잭션이 열린 상태가 된다. 따라서 사용자는 명시적으로 commit 또는 rollback과 같은 트랜잭션 종료 작업을 추가로 해주어야 한다. +LOB 데이터를 SELECT 할때, 내부적으로는 LOB Locator를 얻어와서 처리되기 때문에 연관된 트랜잭션이 열린 상태가 된다. 따라서 사용자는 명시적으로 commit 또는 rollback과 같은 트랜잭션 종료 작업을 추가로 해주어야 한다. > [!CAUTION] > From a582d93ef70117d68772ff1f9ec454a2c1f88d2b Mon Sep 17 00:00:00 2001 From: "jina.kim" <> Date: Tue, 19 Mar 2024 13:26:04 +0900 Subject: [PATCH 4/8] =?UTF-8?q?=EB=A6=AC=EB=B7=B0=20=EC=9D=BC=EB=B6=80=20?= =?UTF-8?q?=EB=B0=98=EC=98=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 리뷰 일부 반영 --- .../Altibase_trunk/kor/CLI User's Manual.md | 4 +- .../Altibase_trunk/kor/JDBC User's Manual.md | 42 +++++++++++-------- 2 files changed, 27 insertions(+), 19 deletions(-) diff --git a/Manuals/Altibase_trunk/kor/CLI User's Manual.md b/Manuals/Altibase_trunk/kor/CLI User's Manual.md index c47d47b87..6548da384 100644 --- a/Manuals/Altibase_trunk/kor/CLI User's Manual.md +++ b/Manuals/Altibase_trunk/kor/CLI User's Manual.md @@ -6944,8 +6944,8 @@ LOB 데이터를 SELECT 할때, 내부적으로는 LOB Loctor를 얻어와서 LOB 데이터와 관련한 작업이 완료된 경우, 관련된 자원을 해제해주어야 한다. 관련 CLI 함수는 아래와 같다. -* SQLFreeLob -* SQLEndTran +* [SQLFreeLob](#sqlfreelob) +* [SQLEndTran](#sqlendtran) SQLFreeLob 함수는 Lob Locator와 관련된 자원을 해제할 뿐, 트랜잭션을 종료하지는 않는다. diff --git a/Manuals/Altibase_trunk/kor/JDBC User's Manual.md b/Manuals/Altibase_trunk/kor/JDBC User's Manual.md index d0a1c1f5a..0bbf8b1c3 100644 --- a/Manuals/Altibase_trunk/kor/JDBC User's Manual.md +++ b/Manuals/Altibase_trunk/kor/JDBC User's Manual.md @@ -2908,7 +2908,7 @@ sPstmt.execute(); 다음은 예제에서 사용되는 테이블을 생성하는 구문이다. -``` +```sql CREATE TABLE BLOB_TABLE ( BLOB_COLUMN BLOB ); ``` @@ -3054,7 +3054,8 @@ sCon.commit(); ```java ... -PreparedStatement sPstmt = connection().prepareStatement("SELECT BLOB_COLUMN +sCon = getConnection(); +PreparedStatement sPstmt = sCon.prepareStatement("SELECT BLOB_COLUMN FROM BLOB_TABLE"); ResultSet sRs = sPstmt.executeQuery(); while(sRs.next()) @@ -3065,6 +3066,7 @@ while(sRs.next()) ... } ... +sCon.commit(); ``` @@ -3074,8 +3076,8 @@ while(sRs.next()) ```java ... final int sReadLength = 100; - -PreparedStatement sPstmt = connection().prepareStatement("SELECT BLOB_COLUMN FROM BLOB_TABLE"); +sCon = getConnection(); +PreparedStatement sPstmt = sCon.prepareStatement("SELECT BLOB_COLUMN FROM BLOB_TABLE"); ResultSet sRs = sPstmt.executeQuery(); @@ -3094,8 +3096,8 @@ while(sRs.next()) } ... } - ... +sCon.commit(); ``` @@ -3374,11 +3376,14 @@ while(sRs.next()) ##### CLOB 데이터 읽기 +LOB 데이터를 읽을 때, 내부적으로는 Lob Locator를 이용하기 때문에 반드시 commit 또는 rollback과 같은 명시적인 트랜잭션 종료 작업을 추가해야 한다. + ###### 1. Reader 객체와 getCharacterStream 메소드를 사용한 방법 -``` +```java ... -PreparedStatement sPstmt = connection().prepareStatement("SELECT CLOB_COLUMN FROM CLOB_TABLE"); +sCon = getConnection(); +PreparedStatement sPstmt = sCon.prepareStatement("SELECT CLOB_COLUMN FROM CLOB_TABLE"); ResultSet sRs = sPstmt.executeQuery(); @@ -3389,6 +3394,7 @@ while(sRs.next()) ... } ... +sCon.commit(); ``` @@ -3396,8 +3402,9 @@ while(sRs.next()) ###### 2. Reader 객체 와 getClob 메소드를 사용한 방법 ``` -... -PreparedStatement sPstmt = connection().prepareStatement("SELECT CLOB_COLUMN FROM CLOB_TABLE"); +... +sCon = getConnection(); +PreparedStatement sPstmt = sCon.prepareStatement("SELECT CLOB_COLUMN FROM CLOB_TABLE"); ResultSet sRs = sPstmt.executeQuery(); @@ -3409,17 +3416,18 @@ while(sRs.next()) ... } ... +sCon.commit(); ``` ###### 3. getClob 메소드와 String 객체를 사용한 방법 -``` +```java ... final int sReadLength = 100; - -PreparedStatement sPstmt = connection().prepareStatement("SELECT CLOB_COLUMN FROM CLOB_TABLE"); +sCon = getConnection(); +PreparedStatement sPstmt = sCon.prepareStatement("SELECT CLOB_COLUMN FROM CLOB_TABLE"); ResultSet sRs = sPstmt.executeQuery(); @@ -3438,8 +3446,8 @@ while(sRs.next()) } ... } - ... +sCon.commit(); ``` @@ -3568,7 +3576,7 @@ sPstmt.close(); 아래는 Blob 객체를 해제하는 코드 예제이다. -``` +```java ... Blob sBlob = sRs.getBlob(1); // Freeing Lob Locator @@ -3581,7 +3589,7 @@ Blob 객체를 free 메소드로 해제하면, 대응하는 Lob Locator가 서 아래는 Clob 객체를 해제하는 코드 예제이다. -``` +```java ... Clob sClob = sRs.getClob(1); // Freeing Lob Locator @@ -3594,7 +3602,7 @@ Clob 객체도 Blob과 마찬가지로 free 메소드로 해제하면, 대응하 아래는 BlobInputStream 객체와 BlobOutputStream 객체를 해제하는 코드 예제이다. -``` +```java InputStream sInputStream = sRs.getBinaryStream(1); // Freeing Lob Locator @@ -3619,7 +3627,7 @@ BlobInputStream 또는 BlobOutputStream 객체를 freeLocator 메소드로 해 아래는 ClobReader 객체와 ClobWriter 객체를 해제하는 코드 예제이다. -``` +```java Reader sClobReader = sRs.getCharacterStream(1); // Freeing Lob Locator From 8b65902599c5168fc2650bae077001ca57e04326 Mon Sep 17 00:00:00 2001 From: "jina.kim" <> Date: Fri, 22 Mar 2024 16:25:31 +0900 Subject: [PATCH 5/8] =?UTF-8?q?=EB=A6=AC=EB=B7=B0=20=EC=B5=9C=EC=A2=85=20?= =?UTF-8?q?=EB=B0=98=EC=98=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 리뷰 최종 반영 --- Manuals/Altibase_7.1/kor/CLI User's Manual.md | 35 +++++++++------- .../Altibase_7.1/kor/JDBC User's Manual.md | 21 ++++++---- Manuals/Altibase_7.3/kor/CLI User's Manual.md | 31 +++++++++----- .../Altibase_7.3/kor/JDBC User's Manual.md | 42 ++++++++++++------- .../Altibase_trunk/kor/CLI User's Manual.md | 2 +- 5 files changed, 83 insertions(+), 48 deletions(-) diff --git a/Manuals/Altibase_7.1/kor/CLI User's Manual.md b/Manuals/Altibase_7.1/kor/CLI User's Manual.md index fc5da3e64..d45a5beb9 100644 --- a/Manuals/Altibase_7.1/kor/CLI User's Manual.md +++ b/Manuals/Altibase_7.1/kor/CLI User's Manual.md @@ -6890,13 +6890,18 @@ SQLTransact(SQL_NULL_HENV, dbc, SQL_COMMIT); ### LOB 데이터 처리 방식 -#### LOB 위치 입력기(LOB Locator) +Altibase는 CLI에서 LOB데이터를 처리하기위해 LOB 위치 입력기(LOB Locator)를 이용한다. LOB 데이터에 대응되는 고유값으로 Altibase 서버의 내부 자료구조이다. LOB 데이터를 연산하기 위해서는 먼저 LOB Locator를 획득해야 하며, 이를 통해 LOB 데이터를 읽거나 쓸 수 있다. LOB Locator는 MVCC와 관련하여 특정 시점의 LOB 데이터를 가리키기 때문에, LOB Locator를 발생시킨 트랜잭션과 생명주기를 같이하며, 그 트랜잭션에 종속된다. -CLI의 일부 함수에서 LOB 데이터를 처리할 때 LOB 위치 입력기를 사용하기 때문에 LOB 위치 입력기를 이용한 LOB 데이터 처리 방식에 대한 이해가 필요하다. +#### 자동 커밋 모드 해제 + +LOB 위치 입력기는 트랜잭션에 종속적이기 때문에 **CLI에서 LOB 위치 입력기를 이용하여 LOB 데이터를 처리하려면 반드시 자동 커밋 모드를 해제해야 한다.** -LOB 위치 입력기는 LOB 데이터를 가리키는 Altibase 서버의 내부 자료구조이며 트랜잭션에 종속된다. +자동 커밋 모드를 해제하면 LOB 위치 입력기를 얻어오는 CLI 함수와 LOB 데이터를 읽고 쓰는 CLI 함수는 하나의 트랜잭션에서 개별 작업이 되어 LOB 위치 입력기를 공유할 수 있다. 반면, 자동 커밋 모드에서는 각각의 개별 트랜잭션으로 동작하기 때문에 두 트랜잭션 간에 LOB 위치 입력기를 공유할 수 없다. + +> **LOB 위치 입력기를 이용한 트랜잭션 커밋 시 주의사항** -CLI에서 LOB 데이터를 처리하는 과정은 LOB 위치 입력기를 얻는 작업과 LOB 위치 입력기를 이용하여 LOB 데이터를 읽고 쓰는 작업으로 나뉜다. +1. 자동 커밋 해제 모드에서 LOB 데이터를 읽고 쓰는 CLI 함수 수행 중 예상치 못한 에러가 발생하면, 내부적으로 초기화된 데이터가 남아 있을 수 있어 **반드시 트랜잭션을 롤백해야 한다.** +2. NOT NULL 제약이 있는 LOB 타입 컬럼에 NULL 값을 INSERT 혹은 UPDATE 수행하면 [Unable to insert (or update) NULL into NOT NULL column.] 에러가 발생한다. 이 경우 초기화된 데이터가 남아 있어 **반드시 트랜잭션을 롤백해야 한다.** #### LOB 위치 입력기 얻기 @@ -6918,24 +6923,22 @@ LOB 위치 입력기를 얻은 후에 이것을 이용하여 LOB 데이터를 - SQLPutLob - SQLTrimLob -#### 자동 커밋 모드 해제 - -LOB 위치 입력기는 트랜잭션에 종속적이기 때문에 **CLI에서 LOB 위치 입력기를 이용하여 LOB 데이터를 처리하려면 반드시 자동 커밋 모드를 해제해야 한다.** +#### LOB 데이터의 조회(SELECT) -자동 커밋 모드에서 LOB 위치 입력기를 얻어오는 CLI 함수와 LOB 데이터를 읽고 쓰는 CLI 함수는 각각 하나의 트랜잭션이기 때문에 두 트랜잭션 간에 LOB 위치 입력기를 공유할 수 없다. 반면, 자동 커밋 모드를 해제하면 LOB 위치 입력기를 얻어오는 CLI 함수와 LOB 데이터를 읽고 쓰는 CLI 함수는 하나의 트랜잭션에서 개별 작업이 되며 LOB 위치 입력기를 공유할 수 있다. 따라서 개별 작업의 성공 여부에 따라 트랜잭션을 커밋할 때 SQL 수행 결과가 달라질 수 있음을 주의해야 한다. +LOB 데이터를 SELECT 할때, 내부적으로는 LOB Locator를 얻어와서 처리되기 때문에 연관된 트랜잭션이 열린 상태가 된다. 따라서 사용자는 명시적으로 commit 또는 rollback과 같은 트랜잭션 종료 작업을 추가로 해주어야 한다. -> **LOB 위치 입력기를 이용한 트랜잭션 커밋 시 주의사항** +> [!CAUTION] +> +> 만약, 사용자가 명시적으로 commit 또는 rollback 과 같은 트랜잭션 종료 작업을 하지 않으면, 데이터베이스의 메모리 사용량이 증가할 수 있다. -이 예시는 LOB 칼럼을 가진 테이블에 INSERT, UPDATE 문을 수행할 때 해당한다. +#### 자원 해제하기 -아래 표의 `결과 1`에서 커밋을 수행하면, LOB 타입 칼럼이 있는 레코드는 LOB 타입 칼럼이 널 값으로 반영될 수 있다. LOB 타입 칼럼의 값이 널 상태로 남기지 않으려면 **반드시 트랜잭션을 롤백해야 한다.** +LOB 데이터와 관련한 작업이 완료된 경우, 관련된 자원을 해제해주어야 한다. 관련 CLI 함수는 아래와 같다. -LOB 타입 칼럼에 NOT NULL 제약조건이 정의되어 있다면 `결과 2` 상황이 발생할 수 있으며, 이때는 에러가 발생하고 부분 롤백 되므로 CLI에서 LOB 데이터 처리를 할 수 없다. +* [SQLFreeLob](#sqlfreelob) +* [SQLEndTran](#sqlendtran) -| 개별 작업 순서 | 개별 작업 | CLI 함수 | 결과 1 | 결과 2 | -| :------------: | :---------------------------------- | :---------------------------- | :----: | :----: | -| 1 | LOB 위치 입력기를 얻어오는 CLI 함수 | SQLBindParameter / SQLExecute | 성공 | 실패 | -| 2 | LOB 데이터를 읽고 쓰는 CLI 함수 | SQLPutLob | 실패 | - | +SQLFreeLob 함수는 Lob Locator와 관련된 자원을 해제할 뿐, 트랜잭션을 종료하지는 않는다. ### LOB 데이터 타입 diff --git a/Manuals/Altibase_7.1/kor/JDBC User's Manual.md b/Manuals/Altibase_7.1/kor/JDBC User's Manual.md index a18cc5772..7eca10e43 100644 --- a/Manuals/Altibase_7.1/kor/JDBC User's Manual.md +++ b/Manuals/Altibase_7.1/kor/JDBC User's Manual.md @@ -2972,11 +2972,14 @@ while(sRs.next()) ##### BLOB 데이터 읽기 +LOB 데이터를 읽을 때, 내부적으로는 Lob Locator를 이용하기 때문에 반드시 commit 또는 rollback과 같은 명시적인 트랜잭션 종료 작업을 추가해야 한다. + ###### 1. InputStream 객체와 getBinaryStream 메소드를 사용한 방법 -``` +```java ... -PreparedStatement sPstmt = connection().prepareStatement("SELECT BLOB_COLUMN +sCon = getConnection(); +PreparedStatement sPstmt = sCon.prepareStatement("SELECT BLOB_COLUMN FROM BLOB_TABLE"); ResultSet sRs = sPstmt.executeQuery(); while(sRs.next()) @@ -2986,15 +2989,17 @@ while(sRs.next()) ... } ... +sCon.commit(); ``` ###### 2. getBlob 메소드와 InputStream 객체를 사용한 방법 -``` +```java ... -PreparedStatement sPstmt = connection().prepareStatement("SELECT BLOB_COLUMN +sCon = getConnection(); +PreparedStatement sPstmt = sCon.prepareStatement("SELECT BLOB_COLUMN FROM BLOB_TABLE"); ResultSet sRs = sPstmt.executeQuery(); while(sRs.next()) @@ -3005,17 +3010,19 @@ while(sRs.next()) ... } ... +sCon.commit(); ``` ###### 3. getBlob 메소드와 byte 배열을 사용한 방법 -``` +```java ... final int sReadLength = 100; -PreparedStatement sPstmt = connection().prepareStatement("SELECT BLOB_COLUMN FROM BLOB_TABLE"); +sCon = getConnection(); +PreparedStatement sPstmt = sCon.prepareStatement("SELECT BLOB_COLUMN FROM BLOB_TABLE"); ResultSet sRs = sPstmt.executeQuery(); @@ -3034,8 +3041,8 @@ while(sRs.next()) } ... } - ... +sCon.commit(); ``` diff --git a/Manuals/Altibase_7.3/kor/CLI User's Manual.md b/Manuals/Altibase_7.3/kor/CLI User's Manual.md index 8998b77d2..cd55a7615 100644 --- a/Manuals/Altibase_7.3/kor/CLI User's Manual.md +++ b/Manuals/Altibase_7.3/kor/CLI User's Manual.md @@ -6900,13 +6900,18 @@ SQLTransact(SQL_NULL_HENV, dbc, SQL_COMMIT); ### LOB 데이터 처리 방식 -#### LOB 위치 입력기(LOB Locator) +Altibase는 CLI에서 LOB데이터를 처리하기위해 LOB 위치 입력기(LOB Locator)를 이용한다. LOB 데이터에 대응되는 고유값으로 Altibase 서버의 내부 자료구조이다. LOB 데이터를 연산하기 위해서는 먼저 LOB Locator를 획득해야 하며, 이를 통해 LOB 데이터를 읽거나 쓸 수 있다. LOB Locator는 MVCC와 관련하여 특정 시점의 LOB 데이터를 가리키기 때문에, LOB Locator를 발생시킨 트랜잭션과 생명주기를 같이하며, 그 트랜잭션에 종속된다. -CLI의 일부 함수에서 LOB 데이터를 처리할 때 LOB 위치 입력기를 사용하기 때문에 LOB 위치 입력기를 이용한 LOB 데이터 처리 방식에 대한 이해가 필요하다. +#### 자동 커밋 모드 해제 + +LOB 위치 입력기는 트랜잭션에 종속적이기 때문에 **CLI에서 LOB 위치 입력기를 이용하여 LOB 데이터를 처리하려면 반드시 자동 커밋 모드를 해제해야 한다.** + +자동 커밋 모드를 해제하면 LOB 위치 입력기를 얻어오는 CLI 함수와 LOB 데이터를 읽고 쓰는 CLI 함수는 하나의 트랜잭션에서 개별 작업이 되어 LOB 위치 입력기를 공유할 수 있다. 반면, 자동 커밋 모드에서는 각각의 개별 트랜잭션으로 동작하기 때문에 두 트랜잭션 간에 LOB 위치 입력기를 공유할 수 없다. -LOB 위치 입력기는 LOB 데이터를 가리키는 Altibase 서버의 내부 자료구조이며 트랜잭션에 종속된다. +> **LOB 위치 입력기를 이용한 트랜잭션 커밋 시 주의사항** -CLI에서 LOB 데이터를 처리하는 과정은 LOB 위치 입력기를 얻는 작업과 LOB 위치 입력기를 이용하여 LOB 데이터를 읽고 쓰는 작업으로 나뉜다. +1. 자동 커밋 해제 모드에서 LOB 데이터를 읽고 쓰는 CLI 함수 수행 중 예상치 못한 에러가 발생하면, 내부적으로 초기화된 데이터가 남아 있을 수 있어 **반드시 트랜잭션을 롤백해야 한다.** +2. NOT NULL 제약이 있는 LOB 타입 컬럼에 NULL 값을 INSERT 혹은 UPDATE 수행하면 [Unable to insert (or update) NULL into NOT NULL column.] 에러가 발생한다. 이 경우 초기화된 데이터가 남아 있어 **반드시 트랜잭션을 롤백해야 한다.** #### LOB 위치 입력기 얻기 @@ -6928,16 +6933,22 @@ LOB 위치 입력기를 얻은 후에 이것을 이용하여 LOB 데이터를 - SQLPutLob - SQLTrimLob -#### 자동 커밋 모드 해제 +#### LOB 데이터의 조회(SELECT) -LOB 위치 입력기는 트랜잭션에 종속적이기 때문에 **CLI에서 LOB 위치 입력기를 이용하여 LOB 데이터를 처리하려면 반드시 자동 커밋 모드를 해제해야 한다.** +LOB 데이터를 SELECT 할때, 내부적으로는 LOB Locator를 얻어와서 처리되기 때문에 연관된 트랜잭션이 열린 상태가 된다. 따라서 사용자는 명시적으로 commit 또는 rollback과 같은 트랜잭션 종료 작업을 추가로 해주어야 한다. -자동 커밋 모드를 해제하면 LOB 위치 입력기를 얻어오는 CLI 함수와 LOB 데이터를 읽고 쓰는 CLI 함수는 하나의 트랜잭션에서 개별 작업이 되어 LOB 위치 입력기를 공유할 수 있다. 반면, 자동 커밋 모드에서는 각각의 개별 트랜잭션으로 동작하기 때문에 두 트랜잭션 간에 LOB 위치 입력기를 공유할 수 없다. +> [!CAUTION] +> +> 만약, 사용자가 명시적으로 commit 또는 rollback 과 같은 트랜잭션 종료 작업을 하지 않으면, 데이터베이스의 메모리 사용량이 증가할 수 있다. -> **LOB 위치 입력기를 이용한 트랜잭션 커밋 시 주의사항** +#### 자원 해제하기 -1. 자동 커밋 해제 모드에서 LOB 데이터를 읽고 쓰는 CLI 함수 수행 중 예상치 못한 에러가 발생하면, 내부적으로 초기화된 데이타가 남아 있을 수 있어 **반드시 트랜잭션을 롤백해야 한다.** -2. NOT NULL 제약이 있는 LOB 타입 컬럼에 NULL 값을 INSERT 혹은 UPDATE 수행하면 [Unable to insert (or update) NULL into NOT NULL column.] 에러가 발생한다. 이 경우 초기화된 데이터가 남아 있어 **반드시 트랜잭션을 롤백해야 한다.** +LOB 데이터와 관련한 작업이 완료된 경우, 관련된 자원을 해제해주어야 한다. 관련 CLI 함수는 아래와 같다. + +* [SQLFreeLob](#sqlfreelob) +* [SQLEndTran](#sqlendtran) + +SQLFreeLob 함수는 Lob Locator와 관련된 자원을 해제할 뿐, 트랜잭션을 종료하지는 않는다. ### LOB 데이터 타입 diff --git a/Manuals/Altibase_7.3/kor/JDBC User's Manual.md b/Manuals/Altibase_7.3/kor/JDBC User's Manual.md index b541cf6a9..1c1842cab 100644 --- a/Manuals/Altibase_7.3/kor/JDBC User's Manual.md +++ b/Manuals/Altibase_7.3/kor/JDBC User's Manual.md @@ -2908,11 +2908,14 @@ while(sRs.next()) ##### BLOB 데이터 읽기 +LOB 데이터를 읽을 때, 내부적으로는 Lob Locator를 이용하기 때문에 반드시 commit 또는 rollback과 같은 명시적인 트랜잭션 종료 작업을 추가해야 한다. + ###### 1. InputStream 객체와 getBinaryStream 메소드를 사용한 방법 -``` +```java ... -PreparedStatement sPstmt = connection().prepareStatement("SELECT BLOB_COLUMN +sCon = getConnection(); +PreparedStatement sPstmt = sCon.prepareStatement("SELECT BLOB_COLUMN FROM BLOB_TABLE"); ResultSet sRs = sPstmt.executeQuery(); while(sRs.next()) @@ -2922,15 +2925,17 @@ while(sRs.next()) ... } ... +sCon.commit(); ``` ###### 2. getBlob 메소드와 InputStream 객체를 사용한 방법 -``` +```java ... -PreparedStatement sPstmt = connection().prepareStatement("SELECT BLOB_COLUMN +sCon = getConnection(); +PreparedStatement sPstmt = sCon.prepareStatement("SELECT BLOB_COLUMN FROM BLOB_TABLE"); ResultSet sRs = sPstmt.executeQuery(); while(sRs.next()) @@ -2941,17 +2946,19 @@ while(sRs.next()) ... } ... +sCon.commit(); ``` ###### 3. getBlob 메소드와 byte 배열을 사용한 방법 -``` +```java ... final int sReadLength = 100; -PreparedStatement sPstmt = connection().prepareStatement("SELECT BLOB_COLUMN FROM BLOB_TABLE"); +sCon = getConnection(); +PreparedStatement sPstmt = sCon.prepareStatement("SELECT BLOB_COLUMN FROM BLOB_TABLE"); ResultSet sRs = sPstmt.executeQuery(); @@ -2970,8 +2977,8 @@ while(sRs.next()) } ... } - ... +sCon.commit(); ``` @@ -3250,11 +3257,14 @@ while(sRs.next()) ##### CLOB 데이터 읽기 +LOB 데이터를 읽을 때, 내부적으로는 Lob Locator를 이용하기 때문에 반드시 commit 또는 rollback과 같은 명시적인 트랜잭션 종료 작업을 추가해야 한다. + ###### 1. Reader 객체와 getCharacterStream 메소드를 사용한 방법 -``` +```java ... -PreparedStatement sPstmt = connection().prepareStatement("SELECT CLOB_COLUMN FROM CLOB_TABLE"); +sCon = getConnection(); +PreparedStatement sPstmt = sCon.prepareStatement("SELECT CLOB_COLUMN FROM CLOB_TABLE"); ResultSet sRs = sPstmt.executeQuery(); @@ -3265,15 +3275,17 @@ while(sRs.next()) ... } ... +sCon.commit(); ``` ###### 2. Reader 객체 와 getClob 메소드를 사용한 방법 -``` +```java ... -PreparedStatement sPstmt = connection().prepareStatement("SELECT CLOB_COLUMN FROM CLOB_TABLE"); +sCon = getConnection(); +PreparedStatement sPstmt = sCon.prepareStatement("SELECT CLOB_COLUMN FROM CLOB_TABLE"); ResultSet sRs = sPstmt.executeQuery(); @@ -3285,17 +3297,19 @@ while(sRs.next()) ... } ... +sCon.commit(); ``` ###### 3. getClob 메소드와 String 객체를 사용한 방법 -``` +```java ... final int sReadLength = 100; -PreparedStatement sPstmt = connection().prepareStatement("SELECT CLOB_COLUMN FROM CLOB_TABLE"); +sCon = getConnection(); +PreparedStatement sPstmt = sCon.prepareStatement("SELECT CLOB_COLUMN FROM CLOB_TABLE"); ResultSet sRs = sPstmt.executeQuery(); @@ -3314,8 +3328,8 @@ while(sRs.next()) } ... } - ... +sCon.commit(); ``` diff --git a/Manuals/Altibase_trunk/kor/CLI User's Manual.md b/Manuals/Altibase_trunk/kor/CLI User's Manual.md index 4a1487258..4d52df5e2 100644 --- a/Manuals/Altibase_trunk/kor/CLI User's Manual.md +++ b/Manuals/Altibase_trunk/kor/CLI User's Manual.md @@ -6899,7 +6899,7 @@ SQLTransact(SQL_NULL_HENV, dbc, SQL_COMMIT); ### LOB 데이터 처리 방식 -Altibase는 CLI에서 LOB데이터를 처리하기위해 LOB Locator를 이용한다. Lob Locator는 LOB 데이터를 가리키는 Altibase 서버의 내부 자료구조로, 운영체제의 파일 포인터와 유사하다. LOB 데이터를 연산하기 위해서는 먼저 LOB Locator를 획득해야 하며, 이를 통해 LOB 데이터를 읽거나 쓸 수 있다. LOB Locator는 MVCC와 관련하여 특정 시점의 LOB 데이터를 가리키기 때문에, LOB Locator를 발생시킨 트랜잭션과 생명주기를 같이하며, 그 트랜잭션에 종속된다. +Altibase는 CLI에서 LOB데이터를 처리하기위해 LOB 위치 입력기(LOB Locator)를 이용한다. LOB 데이터에 대응되는 고유값으로 Altibase 서버의 내부 자료구조이다. LOB 데이터를 연산하기 위해서는 먼저 LOB Locator를 획득해야 하며, 이를 통해 LOB 데이터를 읽거나 쓸 수 있다. LOB Locator는 MVCC와 관련하여 특정 시점의 LOB 데이터를 가리키기 때문에, LOB Locator를 발생시킨 트랜잭션과 생명주기를 같이하며, 그 트랜잭션에 종속된다. #### 자동 커밋 모드 해제 From 99e3cdcd1d4643ba770206b60a84eda2cde82064 Mon Sep 17 00:00:00 2001 From: jina-altibase <43777901+jina-altibase@users.noreply.github.com> Date: Tue, 26 Mar 2024 18:44:48 +0900 Subject: [PATCH 6/8] Update Manuals/Altibase_7.1/kor/CLI User's Manual.md Co-authored-by: Soyoon-Choi <151510931+Soyoon-Choi@users.noreply.github.com> --- Manuals/Altibase_7.1/kor/CLI User's Manual.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Manuals/Altibase_7.1/kor/CLI User's Manual.md b/Manuals/Altibase_7.1/kor/CLI User's Manual.md index d45a5beb9..86b112db1 100644 --- a/Manuals/Altibase_7.1/kor/CLI User's Manual.md +++ b/Manuals/Altibase_7.1/kor/CLI User's Manual.md @@ -6890,7 +6890,7 @@ SQLTransact(SQL_NULL_HENV, dbc, SQL_COMMIT); ### LOB 데이터 처리 방식 -Altibase는 CLI에서 LOB데이터를 처리하기위해 LOB 위치 입력기(LOB Locator)를 이용한다. LOB 데이터에 대응되는 고유값으로 Altibase 서버의 내부 자료구조이다. LOB 데이터를 연산하기 위해서는 먼저 LOB Locator를 획득해야 하며, 이를 통해 LOB 데이터를 읽거나 쓸 수 있다. LOB Locator는 MVCC와 관련하여 특정 시점의 LOB 데이터를 가리키기 때문에, LOB Locator를 발생시킨 트랜잭션과 생명주기를 같이하며, 그 트랜잭션에 종속된다. +Altibase는 CLI에서 LOB데이터를 처리하기위해 LOB 위치 입력기(LOB Locator)를 이용한다. LOB Locator는 LOB 데이터에 대응되는 고유값으로 Altibase 서버의 내부 자료구조이다. LOB 데이터를 연산하기 위해서는 먼저 LOB Locator를 획득해야 하며, 이를 통해 LOB 데이터를 읽거나 쓸 수 있다. LOB Locator는 MVCC와 관련하여 특정 시점의 LOB 데이터를 가리키기 때문에 LOB Locator를 발생시킨 트랜잭션과 생명주기를 같이하며, 그 트랜잭션에 종속된다. #### 자동 커밋 모드 해제 From 2d305c0c555b57f714f716af10b81f1cc3d0f7c4 Mon Sep 17 00:00:00 2001 From: jina-altibase <43777901+jina-altibase@users.noreply.github.com> Date: Thu, 28 Mar 2024 15:58:11 +0900 Subject: [PATCH 7/8] Update Manuals/Altibase_7.1/kor/CLI User's Manual.md --- Manuals/Altibase_7.1/kor/CLI User's Manual.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Manuals/Altibase_7.1/kor/CLI User's Manual.md b/Manuals/Altibase_7.1/kor/CLI User's Manual.md index 86b112db1..8eb67124e 100644 --- a/Manuals/Altibase_7.1/kor/CLI User's Manual.md +++ b/Manuals/Altibase_7.1/kor/CLI User's Manual.md @@ -6896,7 +6896,7 @@ Altibase는 CLI에서 LOB데이터를 처리하기위해 LOB 위치 입력기(LO LOB 위치 입력기는 트랜잭션에 종속적이기 때문에 **CLI에서 LOB 위치 입력기를 이용하여 LOB 데이터를 처리하려면 반드시 자동 커밋 모드를 해제해야 한다.** -자동 커밋 모드를 해제하면 LOB 위치 입력기를 얻어오는 CLI 함수와 LOB 데이터를 읽고 쓰는 CLI 함수는 하나의 트랜잭션에서 개별 작업이 되어 LOB 위치 입력기를 공유할 수 있다. 반면, 자동 커밋 모드에서는 각각의 개별 트랜잭션으로 동작하기 때문에 두 트랜잭션 간에 LOB 위치 입력기를 공유할 수 없다. +자동 커밋 모드를 해제하면 LOB 위치 입력기를 얻어오는 CLI 함수와 LOB 데이터를 읽고 쓰는 CLI 함수는 하나의 트랜잭션내에서 개별 작업으로 동작되어 LOB 위치 입력기를 공유할 수 있다. 반면, 자동 커밋 모드에서는 개별 트랜잭션으로 동작하기 때문에 두 트랜잭션 간에 LOB 위치 입력기를 공유할 수 없다. > **LOB 위치 입력기를 이용한 트랜잭션 커밋 시 주의사항** From 3c94dfa4fae454885b9a7da609ba2378f046a3ce Mon Sep 17 00:00:00 2001 From: "jina.kim" <> Date: Thu, 28 Mar 2024 16:04:21 +0900 Subject: [PATCH 8/8] =?UTF-8?q?=EC=98=A4=ED=83=80=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 오타 수정 --- Manuals/Altibase_7.3/kor/CLI User's Manual.md | 4 ++-- Manuals/Altibase_trunk/kor/CLI User's Manual.md | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Manuals/Altibase_7.3/kor/CLI User's Manual.md b/Manuals/Altibase_7.3/kor/CLI User's Manual.md index cd55a7615..ee2cdec5d 100644 --- a/Manuals/Altibase_7.3/kor/CLI User's Manual.md +++ b/Manuals/Altibase_7.3/kor/CLI User's Manual.md @@ -6900,13 +6900,13 @@ SQLTransact(SQL_NULL_HENV, dbc, SQL_COMMIT); ### LOB 데이터 처리 방식 -Altibase는 CLI에서 LOB데이터를 처리하기위해 LOB 위치 입력기(LOB Locator)를 이용한다. LOB 데이터에 대응되는 고유값으로 Altibase 서버의 내부 자료구조이다. LOB 데이터를 연산하기 위해서는 먼저 LOB Locator를 획득해야 하며, 이를 통해 LOB 데이터를 읽거나 쓸 수 있다. LOB Locator는 MVCC와 관련하여 특정 시점의 LOB 데이터를 가리키기 때문에, LOB Locator를 발생시킨 트랜잭션과 생명주기를 같이하며, 그 트랜잭션에 종속된다. +Altibase는 CLI에서 LOB데이터를 처리하기위해 LOB 위치 입력기(LOB Locator)를 이용한다. LOB Locator는 LOB 데이터에 대응되는 고유값으로 Altibase 서버의 내부 자료구조이다. LOB 데이터를 연산하기 위해서는 먼저 LOB Locator를 획득해야 하며, 이를 통해 LOB 데이터를 읽거나 쓸 수 있다. LOB Locator는 MVCC와 관련하여 특정 시점의 LOB 데이터를 가리키기 때문에, LOB Locator를 발생시킨 트랜잭션과 생명주기를 같이하며, 그 트랜잭션에 종속된다. #### 자동 커밋 모드 해제 LOB 위치 입력기는 트랜잭션에 종속적이기 때문에 **CLI에서 LOB 위치 입력기를 이용하여 LOB 데이터를 처리하려면 반드시 자동 커밋 모드를 해제해야 한다.** -자동 커밋 모드를 해제하면 LOB 위치 입력기를 얻어오는 CLI 함수와 LOB 데이터를 읽고 쓰는 CLI 함수는 하나의 트랜잭션에서 개별 작업이 되어 LOB 위치 입력기를 공유할 수 있다. 반면, 자동 커밋 모드에서는 각각의 개별 트랜잭션으로 동작하기 때문에 두 트랜잭션 간에 LOB 위치 입력기를 공유할 수 없다. +자동 커밋 모드를 해제하면 LOB 위치 입력기를 얻어오는 CLI 함수와 LOB 데이터를 읽고 쓰는 CLI 함수는 하나의 트랜잭션내에서 개별 작업으로 동작되어 LOB 위치 입력기를 공유할 수 있다. 반면, 자동 커밋 모드에서는 각각의 개별 트랜잭션으로 동작하기 때문에 두 트랜잭션 간에 LOB 위치 입력기를 공유할 수 없다. > **LOB 위치 입력기를 이용한 트랜잭션 커밋 시 주의사항** diff --git a/Manuals/Altibase_trunk/kor/CLI User's Manual.md b/Manuals/Altibase_trunk/kor/CLI User's Manual.md index 4d52df5e2..508bc7910 100644 --- a/Manuals/Altibase_trunk/kor/CLI User's Manual.md +++ b/Manuals/Altibase_trunk/kor/CLI User's Manual.md @@ -6899,13 +6899,13 @@ SQLTransact(SQL_NULL_HENV, dbc, SQL_COMMIT); ### LOB 데이터 처리 방식 -Altibase는 CLI에서 LOB데이터를 처리하기위해 LOB 위치 입력기(LOB Locator)를 이용한다. LOB 데이터에 대응되는 고유값으로 Altibase 서버의 내부 자료구조이다. LOB 데이터를 연산하기 위해서는 먼저 LOB Locator를 획득해야 하며, 이를 통해 LOB 데이터를 읽거나 쓸 수 있다. LOB Locator는 MVCC와 관련하여 특정 시점의 LOB 데이터를 가리키기 때문에, LOB Locator를 발생시킨 트랜잭션과 생명주기를 같이하며, 그 트랜잭션에 종속된다. +Altibase는 CLI에서 LOB데이터를 처리하기위해 LOB 위치 입력기(LOB Locator)를 이용한다. LOB Locator는 LOB 데이터에 대응되는 고유값으로 Altibase 서버의 내부 자료구조이다. LOB 데이터를 연산하기 위해서는 먼저 LOB Locator를 획득해야 하며, 이를 통해 LOB 데이터를 읽거나 쓸 수 있다. LOB Locator는 MVCC와 관련하여 특정 시점의 LOB 데이터를 가리키기 때문에, LOB Locator를 발생시킨 트랜잭션과 생명주기를 같이하며, 그 트랜잭션에 종속된다. #### 자동 커밋 모드 해제 LOB 위치 입력기는 트랜잭션에 종속적이기 때문에 **CLI에서 LOB 위치 입력기를 이용하여 LOB 데이터를 처리하려면 반드시 자동 커밋 모드를 해제해야 한다.** -자동 커밋 모드를 해제하면 LOB 위치 입력기를 얻어오는 CLI 함수와 LOB 데이터를 읽고 쓰는 CLI 함수는 하나의 트랜잭션에서 개별 작업이 되어 LOB 위치 입력기를 공유할 수 있다. 반면, 자동 커밋 모드에서는 각각의 개별 트랜잭션으로 동작하기 때문에 두 트랜잭션 간에 LOB 위치 입력기를 공유할 수 없다. +자동 커밋 모드를 해제하면 LOB 위치 입력기를 얻어오는 CLI 함수와 LOB 데이터를 읽고 쓰는 CLI 함수는 하나의 트랜잭션내에서 개별 작업으로 동작되어 LOB 위치 입력기를 공유할 수 있다. 반면, 자동 커밋 모드에서는 각각의 개별 트랜잭션으로 동작하기 때문에 두 트랜잭션 간에 LOB 위치 입력기를 공유할 수 없다. > **LOB 위치 입력기를 이용한 트랜잭션 커밋 시 주의사항**