2017-11-17 11 views
0

レルムのデータベースの仕組みを調べるのにかなりの時間を費やしましたが、レルムが書き込み中に選択したデータの行レベルの読み取りロックを使用しているかどうかはわかりませんトランザクション。レルムが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

答えて

1

、TL; DRは、レルム・サポートは、SELECT FOR UPDATEはありませんか?

私が質問を正しく理解していれば、答えはそれよりやや厄介です。

レルムオブジェクトサーバーが存在しない場合、realm.write(() =>は同時に他の書き込みを禁止し、トランザクションが開かれたときにレルムを最新のバージョンに更新します。

Realmオブジェクトサーバーが関与している場合、これは引き続きローカルに存在しますが、Realm Syncはリモートからの更新を管理します。この場合、競合解決ルールがリモートデータ変更に適用されます。

+0

"realm.write(()=>他の書き込みを同時に許可しないで、トランザクションを開いたときにRealmを最新バージョンに更新する" これは、レルム書き込みトランザクション内で発生する選択が常に最新のデータを見ていますか? – billmalarky

+1

はい、まさに私が意味していたことです。実際には、変更があったときにクエリ条件が即座に評価されるため注意が必要です。たとえば、クエリ条件として 'someBool = true'を指定した場合、その結果から取得したオブジェクトに対してfalseに設定すると、結果スナップショットでない限り、そのオブジェクトはその結果になりません。 – EpicPandaForce

+0

ありがとうございました。 – billmalarky

0

レルムは並行書き込みを許可しません。いつでも最大で1つの進行中のトランザクション があります。

async getNextJob()関数が同時に2回呼び出された場合は、 のいずれかがrealm.write()でブロックされます。

SELECT FOR UPDATEは、同時更新がないため、簡単に動作します。

関連する問題