2014-07-16 5 views
1

TL; DR 기능을 원합니다 : "Y는 Y가 10 인 경우에만 업데이트"그렇지 않으면 실패합니다.Datomic 데이터베이스를 사용하여 원자 적 조작을 수행하려면 어떻게해야합니까?

예 : T1, T2 및 T3 인 타임 라인을 상상해보십시오. 시간 T1에서, 엔티티 X는 속성 Y = 10을 포함하고, 시간 T2에서 속성은 Y = 14이다. 내 목표는 Y에서 복잡한 연산을 적용하는 것입니다 (이 연산은 1의 합계라고 가정). T1에서 Y의 값을 읽습니다.이 값은 10이며이 값을 처리 할 대기열에 저장합니다. T3에서 복잡한 연산이 완료되고 결과가 11 일 때 Y 속성을 업데이트합니다. 단순히 속성을 업데이트하면 T2에 있던 값 Y = 14가 실수로 삭제됩니다. 그러나 T3에서 업데이트시 최종 값이 Y = 10인지 확인하고 그렇지 않으면 재 처리를 위해 T2에서 Y = 14를 읽어야합니다.

원자 읽기 - 수정 - 업데이트 프로세싱을 수행하는 방법은 대략 Database Functions으로 알고 있지만 작업이 복잡하고 분산 된 (큐에 넣은 후) 수행해야하는 경우에는이 방법이 좋지 않습니다.

내가 원하는 것은 DynamoDB에서 Conditional Writes에 해당하는 것입니다.

답변

1

에 설명되어 있습니다, 수 당신이 아니라 사용 붙박이 것 see :db.fn/cas?

+0

@RodyD, 완벽, 정확하게. –

2

보장 프로세스 피어 측을 실행하고 특정 기준 T에 대해 유효성을 검사 한 다음 트랜잭션에서 데이터베이스의 기준 T를 확인할 수 있습니다. 따라서 계산적으로 복잡하거나 값 비싼 코드는 피어 측에서 처리되고 트랜잭션 기능은 기본 T 검증에만 책임이 있습니다.

표준 사용 사례 (예 : 설명에 나와있는 예)와 일치하는 것이 있으면 Database Functions이 정확하고 표준적인 답변입니다.

내장 : db.fn/CAS 기능을 사용할 수 있으며 이제 펠리페의 코멘트 "경우에만 또는 던져 예외 삽입 트랜잭션 기능"과 관련하여 http://docs.datomic.com/transactions.html

+0

감사합니다. Ben! INSERT ONLY 을 작성하거나 그렇지 않으면 예외를 발생시키는 트랜잭션 함수를 작성합니다. 그것은 내 문제를 해결해야합니다. –

+0

내장 된 fn이 정확히 다음을 수행합니다. : db.fn/cas (@RoryD 응답에서) –

+1

최근에 : db.fn/cas 내장을 포함하도록 설명서가 업데이트되었습니다. 반영 할 답변을 업데이트했습니다. –

관련 문제