저는 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
"realm.write (() => 동시에 다른 쓰기를 허용하지 않고 트랜잭션이 열릴 때 영역을 최신 버전으로 업데이트 함" 영역 쓰기 트랜잭션 내에서 발생하는 선택이 항상 최신 데이터를보고 있습니까? – billmalarky
네, 정확히 그 의미였습니다. 변경 사항이있을 때 쿼리 조건이 즉시 평가되기 때문에 실제로주의해야 할 사항입니다. 예를 들어 쿼리 조건으로'someBool = true'를 사용하면 그 결과에서 얻은 객체에 false로 설정하면 결과 스냅 샷이 아니면 그 객체는 더 이상 결과에 없을 것입니다. – EpicPandaForce
우수 감사합니다. – billmalarky