SyncAdapter を使用して RESTful Android アプリを開発しています。いくつかのスクリーンキャストを見て、いくつかのチュートリアルを読みましたが、基本的なダイナミクスしか扱っていません。コードを書き始める前に、専門家のユーザーから並行性の問題についてフィードバックを受けたいと思います。
ステップ 1. ユーザーはデータベースのテーブルにU
新しいエントリを挿入します。エントリには列があります。E
T
status = TO_SYNC
ステップ 2. エントリE
が同期される前に、エントリU
を変更することを決定します。A
の列の値を変更するためのアクティビティが開始されますE
。
ステップ 3. ユーザーがエントリーを変更している間に、SyncAdapter が始動し、エントリーをstatus == TO_SYNC
サーバーに送信します。エントリごとに、サーバーから肯定的な応答を受け取ると、SyncAdapter
セットが設定されます。status = SYNCED
ステップ 4. 同じエントリへの同時アクセスE
によって競合が発生するとします。
- SyncAdapter は を読み取り、サーバー
E
に送信しますE
- アクティビティ
A
が完了し、E
ステータスがTO_SYNC
- SyncAdapter はサーバーから ok を受け取り、
status
ofE
をに設定します。SYNCED
- この時点では、値が SyncAdapter によって上書きされているため、新しい値は
E
同期されません。TO_SYNC
私の質問は、begin/end transaction
同期中にデータベース全体をブロックせずにこのような問題を回避するにはどうすればよいですか (完了するまでに時間がかかる可能性があります)。単一のエントリに対して従来の Java ロックを使用する必要がありますか? もっとエレガントな方法はありますか?