【发布时间】:2017-06-08 18:15:23
【问题描述】:
我正在使用 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 并将
E的status设置为SYNCED - 此时,
E的新值将不会同步,因为值TO_SYNC已被 SyncAdapter 覆盖。
我的问题是:如何避免此类问题,而不会在同步时使用begin/end transaction 阻塞整个数据库(这可能需要很长时间才能完成)?我应该在单个条目上使用经典的 java 锁吗?有没有更优雅的方式?
【问题讨论】:
标签: android-syncadapter database-concurrency