Read committed VS Repeatable read

POSTGRESQL 2019. 12. 18. 11:32

postgreSQL은 SQL 표준 트랜잭션 고립화 수준 중 Read committed, Repeatable read, Serializable 를 지원합니다. 그중 Read committed와 Repeatable read의 차이에 대해 정리해 보려 합니다.

 

1. Read committed : postgreSQL 의 default 고립화수준으로 begin 명령으로 트랜잭션을 시작하면 Read committed 모드가 적용됩니다. 쿼리가 시작되기 전 다른 트랜잭션에서 commit 된 결과를 참조할 수 있으며 동일 트랜잭션 상에서 동일한 쿼리문에 대해 서로 다른 결과를 조회(Phantom-Read)할 수 있습니다.

다시말해, 트랜잭션 내에서 같은 SELECT문을 실행하더라도 다른 트랜잭션의 commit 여부에 따라 다른 결과가 출력됩니다.

 

< 테스트 >

- TRANSACTION #1

postgres=# SHOW default_transaction_isolation;
 default_transaction_isolation 
-------------------------------
 read committed
(1 row)

postgres=# create table transaction_isolation_test(c1 int);
CREATE TABLE
postgres=# insert into transaction_isolation_test select 1 from generate_series(1,10) as n;
INSERT 0 10
postgres=# begin;
BEGIN
postgres=# select sum(c1) from transaction_isolation_test ;
 sum 
-----
  10
(1 row)

- TRANSACTION #2에서 1건 삽입

postgres=# begin;
BEGIN
postgres=# insert into transaction_isolation_test values(1);
INSERT 0 1
postgres=# commit;
COMMIT

- TRANSACTION #1에서 재조회 : TRANSACTION B에서 insert 한 결과가 반영됩니다.

postgres=# select sum(c1) from transaction_isolation_test ;
 sum 
-----
  11
(1 row)

 

 

2. Repeatable read : 트랜잭션이 시작되기 전(쿼리가 시작되기 전이 아닌) commit 된 결과를 참조합니다. phantom-read 를 불허(mysql은 SELECT는 안되는데 UPDATE는 됨.)하므로 트랜잭션 내 같은 쿼리문은 트랜잭션이 시작된 시점의 데이터 스냅샷 정보를 조회하기 때문에 다른 트랜잭션의 commit 여부와 무관하게 항상 같은 결과가 출력됩니다.

 

<테스트>

- TRANSACTION #1

postgres=# truncate table transaction_isolation_test ;
TRUNCATE TABLE
postgres=# insert into transaction_isolation_test select 1 from generate_series(1,10);
INSERT 0 10
postgres=# begin transaction isolation level repeatable read;
BEGIN
postgres=# select sum(c1) from transaction_isolation_test ;
 sum 
-----
  10
(1 row)

- TRANSACTION #2

postgres=# begin;
BEGIN
postgres=# insert into transaction_isolation_test values(1);
INSERT 0 1
postgres=# commit;
COMMIT

- TRANSACTION #1 : TRANSACTION B에서 커밋한 결과가 반영되지 않고 커밋전의 조회결과와 동일한 결과를 반환합니다.

postgres=# select sum(c1) from transaction_isolation_test ;
 sum 
-----
  10
(1 row)

 

<Read committed VS Repeatable read>

 

OLAP 환경에서 보고서를 작성할때 다른 트랜잭션에서 발생하는 데이터의 추가/삭제/변경분이 이슈원인이 될 수 있는 상황이라면 Repeatable read 모드를 통한 해결이 가능합니다.

window secureCRT 로 GCP 연결하기

BIG-DATA 2018. 12. 28. 10:38

1. window Git 또는 puttygen과 같이 윈도우 기반 ssh키를 생성해주는 유틸을 먼저 설치해야 합니다.

(window ssh-keygen 으로 검색하시면 됩니다.)

저같은 경우 window git이 설치되어 있어 git bash를 사용했습니다.



2. rsa 타입으로 공개키와 비밀키를 생성할때 comment(-C) 옵션으로 메일정보를 입력합니다.

GCP에 공개키 저장 시 콘솔상에서 계정명을 식별하는데 코멘트 정보가 필요합니다.(물론 코멘트 정보를 따로 타이핑하셔도 됩니다.)

$ ssh-keygen -t rsa -C "kimminsirk@gmail.com"
  
  

C:\user\계정명\.ssh 하위에 생성된 공개키(id_rsa.pub) 를 복사합니다.



3. GCP 콘솔장에서 인스턴스 이름을 클릭하고, ssh키 섹션에 [표시 및 수정]을 클릭하여 ssh 정보를 붙여넣기 합니다.



코멘트 옵션으로 이메알주소를 공개키에 추가했다면, 계정명이 자동으로 resolve 됩니다.



4. secureCRT 에서 GCP 인스턴스의 외부IP를 호스트명으로 설정하고, Public Key properties 에서 비밀키 경로를 설정하여 접속합니다.





은전한닢 형태소 분석기와 full-text-search 모듈 연동

POSTGRESQL 2018. 12. 10. 17:42
현재 사용중인 검색엔진의 캐싱 문제로 full-text-search에 대해 조사하던 중 
한글 형태소 분석기와 사전을 RDBMS로 활용할 수 있으면 효율적인 운영이 가능하겠다 싶어 
은전한닢 형태소 분석기를 postgreSQL Full text search 모듈에 연동해 보았습니다. 
external C 소스 및 컴파일 스크립트는 textsearch_ko 프로젝트를 참조하였습니다. 

 1. MECAB-KO 설치
$ yum install gcc-c++ libstdc++ -y
$ git clone https://bitbucket.org/eunjeon/mecab-ko.git
$ cd mecab-ko
$ ./configure 
$ make all && make install
2. MECAB-KO-DIC 설치
$ wget https://bitbucket.org/eunjeon/mecab-ko-dic/downloads/mecab-ko-dic-2.1.1-20180720.tar.gz
$ tar xzf mecab-ko-dic-2.1.1-20180720.tar.gz
$ cd mecab-ko-dic-2.1.1-20180720
$ ./configure
$ make all && make install

3. 형태소 분석기 설치확인

$ echo '아버지가방에들어가신다'|mecab
아버지  NNG,*,F,아버지,*,*,*,*
가      JKS,*,F,가,*,*,*,*
방      NNG,장소,T,방,*,*,*,*
에      JKB,*,F,에,*,*,*,*
들어가  VV,*,F,들어가,*,*,*,*
신다    EP+EC,*,F,신다,Inflect,EP,EC,시/EP/*+ㄴ다/EC/*
EOS
4. extension 소스를 github 에서 다운로드 후 컴파일
$ git clone https://github.com/i0seph/textsearch_ko.git
$ cd textsearch_ko
$ make USE_PGXS=1
$ make USE_PGXS=1 install
5. 함수생성 스크립트를 실행
postgres=# \i ts_mecab_ko.sql
SET
BEGIN
psql:ts_mecab_ko.sql:12: ERROR:  could not load library "/usr/local/pgsql/lib/ts_mecab_ko.so": libmecab.so.2: cannot open shared object file: No such file or directory
psql:ts_mecab_ko.sql:17: ERROR:  current transaction is aborted, commands ignored until end of transaction block
psql:ts_mecab_ko.sql:22: ERROR:  current transaction is aborted, commands ignored until end of transaction block
psql:ts_mecab_ko.sql:30: ERROR:  current transaction is aborted, commands ignored until end of transaction block
psql:ts_mecab_ko.sql:32: ERROR:  current transaction is aborted, commands ignored until end of transaction block
psql:ts_mecab_ko.sql:41: ERROR:  current transaction is aborted, commands ignored until end of transaction block
psql:ts_mecab_ko.sql:45: ERROR:  current transaction is aborted, commands ignored until end of transaction block
psql:ts_mecab_ko.sql:49: ERROR:  current transaction is aborted, commands ignored until end of transaction block
psql:ts_mecab_ko.sql:55: ERROR:  current transaction is aborted, commands ignored until end of transaction block
psql:ts_mecab_ko.sql:57: ERROR:  current transaction is aborted, commands ignored until end of transaction block
psql:ts_mecab_ko.sql:63: ERROR:  current transaction is aborted, commands ignored until end of transaction block
psql:ts_mecab_ko.sql:69: ERROR:  current transaction is aborted, commands ignored until end of transaction block
psql:ts_mecab_ko.sql:73: ERROR:  current transaction is aborted, commands ignored until end of transaction block
psql:ts_mecab_ko.sql:93: ERROR:  current transaction is aborted, commands ignored until end of transaction block
psql:ts_mecab_ko.sql:98: ERROR:  current transaction is aborted, commands ignored until end of transaction block
psql:ts_mecab_ko.sql:103: ERROR:  current transaction is aborted, commands ignored until end of transaction block
ROLLBACK
# libmecab.so.2 not found 오류 시 해당경로를 ld.so.conf 파일에 추가하여 리로드 합니다.
$ ldconfig -p|grep mecab
$ sudo find / -name libmecab.so.2
/usr/local/lib/libmecab.so.2
/home/postgres/soft/mecab-ko/src/.libs/libmecab.so.2
$ sudo vi /etc/ld.so.conf
include ld.so.conf.d/*.conf
/usr/local/lib # 추가
$ldconfig # /etc/ld.so.conf 리로드
$ ldconfig -p|grep mecab
        libmecab.so.2 (libc6,x86-64) => /usr/local/lib/libmecab.so.2
        libmecab.so (libc6,x86-64) => /usr/local/lib/libmecab.so
# 함수생성 스크립트를 실행합니다.
postgres=# \i ts_mecab_ko.sql 
SET
BEGIN
CREATE FUNCTION
CREATE FUNCTION
CREATE FUNCTION
CREATE TEXT SEARCH PARSER
COMMENT
CREATE FUNCTION
CREATE TEXT SEARCH TEMPLATE
CREATE TEXT SEARCH DICTIONARY
CREATE TEXT SEARCH CONFIGURATION
COMMENT
ALTER TEXT SEARCH CONFIGURATION
ALTER TEXT SEARCH CONFIGURATION
ALTER TEXT SEARCH CONFIGURATION
CREATE FUNCTION
CREATE FUNCTION
CREATE FUNCTION
COMMIT
6. 함수생성 결과 확인
postgres=# select * from mecabko_analyze('아버지가방에들어가신다.');
  word  | type | part1st | partlast | pronounce | conjtype | conjugation | basic | detail | lucene 
--------+------+---------+----------+-----------+----------+-------------+-------+--------+--------
 아버지 | NNG  |         | F        | 아버지    |          |             |       |        | 아버지
 가     | JKS  |         | F        | 가        |          |             |       |        | 가
 방     | NNG  | 장소    | T        | 방        |          |             |       |        | 방
 에     | JKB  |         | F        | 에        |          |             |       |        | 에
 들어가 | VV   |         | F        | 들어가    |          |             |       |        | 들어가
 시     | EP   |         | F        | 시        |          |             |       |        | 
 ㄴ다     | EF   |         | F        | ㄴ다        |          |             |       |        | 
 .      | SF   |         |          | .         |          |             |       |        | .
(8 rows)
# 한국어 full-text-search 기능을 온전히 사용하기 위해 default_text_search_config 파라메터를 korean 으로 변경합니다.
postgres=# select * from to_tsvector('아버지가방에들어가신다');
        to_tsvector         
----------------------------
 '아버지가방에들어가신다':1
(1 row)

postgres=# show default_text_search_config;
 default_text_search_config 
----------------------------
 pg_catalog.english
(1 row)

postgres=# set default_text_search_config = 'korean';
SET
postgres=# select * from to_tsvector('아버지가방에들어가신다');
         to_tsvector          
------------------------------
 '들어가':3 '방':2 '아버지':1
(1 row)


이후 세부적인 테스트결과도 정리해 보려 합니다.