일래스틱서치의 문서를 보면 내부에서 낙관적 동시 제어를 지원한다고 얘기를 한다.

실제 versioning도 지원되는 것도 그 배경이다.


동시성 충돌 때문에 레코드를 잠그는 비관적 동시 제어(select for update) 하는 DB와 다르다. 


한 트랙잭션이 다른 트랙잭션과 충돌할 가능성이 적은 곳에서 사용된다. 


그렇지만, 충돌이 되더라도 반영을 안하는 것은 아니다. 원 데이터가 수정이 되었나 체크해서 수정된 것이 판별되면 이미 실행된 트랙잭션이 롤백이 일어나고 다시 시작한다. 따라서 일래스틱서치에서는 수정된 데이터를 읽을 수 있도록 처리 되어 있다.


일래스틱서치에서 트랙잭션이 동시에 일어나 데이터가 변경되면 version이 증가된다. GET 요청에 대해서 확인할 수 있다.

원래 요청했던 version이 1인데, 응답의 body에는 2가 리턴된다.  (다큐먼트를 색인할 때 version의 디폴트 값은 1이다) 


 



PUT /website/blog/1?version=1 

.. "_version" : 2 ..



그러나 처리 중간에 트랜잭션에 의해서 값이 변경될 수 있다. 그 때는 409 conflict 응답을 받는다.

(REST API는 확실히 지원하나, 언어별 클라이언트에서는 의도하지 않는 응답이 올 수 있다고 한다.)


일래스틱서치는 변경 또는 삭제 요청에만 version 파라미터를 사용할 수 있는 낙관적 동시 제어를 지원한다.


스크립트 실행 동안 변경이 일어나면, 스크립트가 변경된 데이터로 재실행된 결과를 얻는다.



출처 : 


https://www.elastic.co/guide/en/elasticsearch/guide/master/version-control.html


https://www.elastic.co/guide/en/elasticsearch/guide/current/optimistic-concurrency-control.html


https://www.elastic.co/blog/elasticsearch-versioning-support


http://en.wikipedia.org/wiki/Optimistic_concurrency_control


'Elasticsearch' 카테고리의 다른 글

[elasticsearch] Query vs Filter  (0) 2015.06.01
hit  (0) 2015.05.31
[elasticsearch] 색인 앨리어스 (별명)  (0) 2015.05.28
[elasticsearch] failed to put mappings on indices  (0) 2015.05.27
[elasticsearch] flush, refresh, optimization  (0) 2015.05.26
Posted by '김용환'
,