2017-11-17 9 views
0

저는 Realm 데이터베이스 메커니즘을 조사하는 데 상당한 시간을 투자했는데 영역이 쓰기 중 선택된 데이터에 대한 후드 아래에서 행 레벨 읽기 잠금을 사용하는지 알 수 없습니다 업무.Realm에서 SELECT FOR UPDATE 스타일 읽기 잠금을 지원합니까?

기본적인 예를 들어, 내가 getNextJob을 (호출하면)

async getNextJob() { 

    let nextJob = null; 

    this.realm.write(() => { 

     let jobs = this.realm.objects('Job') 
     .filtered('active == FALSE') 
     .sorted([['priority', true], ['created', false]]); 

     if (jobs.length) { 
     nextJob = jobs[0]; 
     nextJob.active = true; 
     } 

    }); 

    return nextJob; 

    } 

을 (우리는 5 일을 말할 것이다)

큐는 작업의 임의의 번호를 가지고 가정 아래의 "큐"논리를 상상 2 번 동시에 행 수준 읽기 차단이 발생하지 않으면 작업을 쿼리 할 때 nextJob이 동일한 작업 객체를 반환 할 가능성이 있습니다.

또한 읽기 논리의 최신 데이터 (예 : 현재 시간에 실제로 true 일 때 job.active == false)에 의존하는 외부 논리가있는 경우 업데이트 트랜잭션이 완료 될 때까지 읽어야합니다 . MVCC는이 상황에서 부실 데이터가 작동하지 않음을 읽습니다.

읽기 잠금을 쓰기 트랜잭션에 설정되는 경우, 나는 항상, 그래서 기본적으로 그렇게

let active = null; 
this.realm.write(() => { 

    const job = this.realm.pseudoQueryToGetJobByPrimaryKey(); 
    active = job.active; 

}); 

// Assuming the above write transaction blocked the read until 
// any concurrent updates touching the same job committed 
// the value for active can be trusted at this point in time. 
if (active === false) { 
    // code to start job here 
} 

같은 최신 데이터를 읽고 TL있어 확인 할 수; DR은 영역 지원은 UPDATE 선택 하는가? 그래서 기본적

PostgreSQL을

https://www.postgresql.org/docs/9.1/static/explicit-locking.html

MySQL의

https://dev.mysql.com/doc/refman/5.7/en/innodb-locking-reads.html

답변

1

을 TL; DR 영역이 지원 UPDATE를 선택 하는가?

질문을 올바르게 이해하면 대답은 약간 까다 롭습니다.

관련된 영역 서버가없는 경우 realm.write(() =>은 다른 모든 쓰기를 동시에 허용하지 않으며 트랜잭션이 열릴 때 영역을 해당 최신 버전으로 업데이트합니다.

Realm Object Server가 관련되어 있으면 로컬로 계속 유지되지만 Realm Sync는 원격에서 데이터를 관리하므로 충돌 해결 규칙이 원격 데이터 변경에 적용됩니다.

+0

"realm.write (() => 동시에 다른 쓰기를 허용하지 않고 트랜잭션이 열릴 때 영역을 최신 버전으로 업데이트 함" 영역 쓰기 트랜잭션 내에서 발생하는 선택이 항상 최신 데이터를보고 있습니까? – billmalarky

+1

네, 정확히 그 의미였습니다. 변경 사항이있을 때 쿼리 조건이 즉시 평가되기 때문에 실제로주의해야 할 사항입니다. 예를 들어 쿼리 조건으로'someBool = true'를 사용하면 그 결과에서 얻은 객체에 false로 설정하면 결과 스냅 샷이 아니면 그 객체는 더 이상 결과에 없을 것입니다. – EpicPandaForce

+0

우수 감사합니다. – billmalarky

0

영역은 동시 쓰기를 허용하지 않습니다. 어느 시점에서든지 최대 한 개의 계속 진행중인 트랜잭션 이 있습니다.

비동기 getNextJob() 함수가 동시에 두 번 호출되면 중 하나가 realm.write()에서 차단됩니다.

SELECT FOR UPDATE는 동시 업데이트가 없으므로 간단하게 작동합니다.