レルムのデータベースの仕組みを調べるのにかなりの時間を費やしましたが、レルムが書き込み中に選択したデータの行レベルの読み取りロックを使用しているかどうかはわかりませんトランザクション。レルムがSELECT FOR UPDATEスタイルの読み取りロックをサポートしています
基本的な例としては、以下の「キュー」の論理を想像
は)私がgetNextJob(呼び出すと、キューがジョブの任意の数(私たちは5つのジョブを言うよ)
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;
}
を持っていると仮定2回並行して、行レベルの読み取りブロッキングが発生していない場合、ジョブを照会するときにnextJobが同じジョブオブジェクトを返す可能性があります。
さらに、読取りロジックの最新のデータに依存する外部ロジックがある場合(つまり、現時点で実際にtrueの場合はjob.active == false)、更新トランザクションが完了するまで読み取りをブロックする必要があります。この状況では、MVCCは古いデータを取得することはできません。
読み取りロックが書き込みトランザクションに設定されている場合は、私はいつも、そこで、基本的TLをそう
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
}
のような最新のデータを読んでいることを確認してください可能性があり、DRは、レルム・サポートは、SELECT FOR 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(()=>他の書き込みを同時に許可しないで、トランザクションを開いたときにRealmを最新バージョンに更新する" これは、レルム書き込みトランザクション内で発生する選択が常に最新のデータを見ていますか? – billmalarky
はい、まさに私が意味していたことです。実際には、変更があったときにクエリ条件が即座に評価されるため注意が必要です。たとえば、クエリ条件として 'someBool = true'を指定した場合、その結果から取得したオブジェクトに対してfalseに設定すると、結果スナップショットでない限り、そのオブジェクトはその結果になりません。 – EpicPandaForce
ありがとうございました。 – billmalarky