Android YieldIFCompletedSafey()是否会失去交易的好处?
我有一个在后台线程中执行的长时间运行的操作。由于操作成功完成与否非常重要,因此我将在事务中包装整个操作 在此期间,UI的各个方面需要对数据库进行只读访问。为了避免阻塞UI,我正在尝试在后台操作的主循环中插入对Android YieldIFCompletedSafey()是否会失去交易的好处?,android,sqlite,transactions,Android,Sqlite,Transactions,我有一个在后台线程中执行的长时间运行的操作。由于操作成功完成与否非常重要,因此我将在事务中包装整个操作 在此期间,UI的各个方面需要对数据库进行只读访问。为了避免阻塞UI,我正在尝试在后台操作的主循环中插入对db.yieldiff竞争者安全()的调用 这正是我想要的,因为UI不再被阻塞,但我并不完全清楚这是否有可能导致数据完整性丢失 yieldiff竞争者安全()的javadoc说明: 暂时结束事务以让其他线程运行。这个 到目前为止,交易被认为是成功的。不要打电话 调用此之前,setTransa
db.yieldiff竞争者安全()的调用
这正是我想要的,因为UI不再被阻塞,但我并不完全清楚这是否有可能导致数据完整性丢失
yieldiff竞争者安全()的javadoc说明:
暂时结束事务以让其他线程运行。这个
到目前为止,交易被认为是成功的。不要打电话
调用此之前,setTransactionSuccessful。当返回一个新的
事务将已创建,但未标记为成功。这
假设不存在嵌套事务(beginTransaction具有
仅被调用一次)并将抛出异常(如果该异常不是
案例
这是否意味着我的长时间运行的操作实际上是以单独的数据块提交给数据库,或者整个事务是否保持足够的状态,以便在最后一次性提交全部数据,从而保持数据完整性
这是否意味着我的长时间运行的操作实际上是以单独的块提交给数据库的
对。在yieldiffrantedsafely()
中,Android调用setTransactionSuccessful()
,endTransaction()
,并开始一个新的事务——在这个过程中提交您的语句。没有机制在“真实”事务结束后回滚它
只有当有另一个线程在数据库上等待时,才会发生此行为,否则yieldiffractedsafely()
什么也不做
我用下面的场景检查了这一点。我启动了两个线程:一个使用事务将数据插入表中,另一个从同一个表中读取数据。事务没有调用setTransactionSuccessful()
,因此通常在结束时回滚所有内容,使表为空。我添加了一个对yieldiffrantedsafely()
的调用,之后该表不是空的,并且有来自事务的数据