Clojure에서 OrientDB 주위에 래퍼를 작성하고 있습니다. OrientDB의 가장 큰 한계 (IMHO) 중 하나는 ODatabaseDocumentTx
이 스레드로부터 안전하지 않으며, .open()
에서 .close()
까지의 수명이 단일 트랜잭션을 나타 내기로되어있어 트랜잭션이 효과적으로 발생하도록하는 것은 단일 스레드라는 것입니다. 실제로 이러한 하이브리드 데이터베이스/트랜잭션 객체에 대한 스레드 로컬 참조는 기본적으로 제공됩니다. 하지만 "실제"상태를 유지하려는 동일한 스레드에 로그인하려면 어떻게해야합니까? 오류가 발생하면 로그 항목도 롤백됩니다! 그 사용 사례만으로는 사실상 모든 DBMS에서 벗어날 수 있습니다. 대부분의 경우 명명 된 트랜잭션 범위 관리를 허용하지 않기 때문입니다./soapboxClojure에서 단일 스레드로 수행되도록 대기 메서드 호출
어쨌든 OrientDB는 그 방법이며 나에게 변하지 않을 것입니다. Clojure를 사용하고 있는데 with-tx
본문 내의 모든 명령형 데이터베이스 호출이 직렬화되도록 with-tx
매크로를 구성하는 우아한 방법이 필요합니다.
분명히 몸체가 생성 된 with-tx
의 최상위 레벨에서 전초전을 만들고 모든 양식을 최하위 수준으로 분해하여 동기화 된 블록에 배치함으로써 무차별 대입 할 수 있습니다. 그게 끔찍한데, 그게 어떻게 pmap
과 상호 작용하는지 모르겠습니다.
ODatabaseDocumentTx
개체에 대한 호출을 매크로 본문에서 검색하여 동기화 된 블록으로 래핑 할 수 있습니다.
에이전트를 사용하여 일종의 디스패치 시스템을 만들 수 있습니다.
또는 ODatabaseDocumentTx를 동기화 된 메서드 호출로 하위 클래스화할 수 있습니다.
나는 다른 접근법을 생각하면서 머리를 긁적니다. 생각? 일반적으로 에이전트 접근법은 코드 블록에 데이터베이스 메소드 호출이 산재되어있는 경우 모든 계산을 앞당기 고 호출 대기열에 넣고 마지막에 DB 전체를 실행하기 때문에 에이전트 방식이 더 매력적으로 보입니다. 그러나이 계산에서는 읽기 일관성을 보장 할 필요가 없다고 가정합니다. IDK.
어떤 종류의 스레드 안전하지 않은가 발생 : 하나의 "트랜잭션 개체"두 스레드에 의해 액세스 할 수 없거나 데이터베이스가 동시 기록을 지원하지 않습니다입니까? – vemv