我有一个在后台线程中执行的长时间运行的操作。由于操作成功完成或根本不完成很重要,因此我将整个操作包装在一个事务中。
在此期间,UI 的各个方面需要对数据库进行只读访问。为了避免阻塞 UI,我尝试在后台操作的主循环中插入对 db.yieldIfContendedSafely()
的调用。
这就是我想要的,因为 UI 不再被阻止,但我并不完全清楚这是否有丢失数据完整性的风险。yieldIfContendedSafely()
的 javadoc 说:
这是否意味着我的长时间运行的操作实际上是在单独的块中提交给数据库,或者整个事务是否维护了足够的状态以在最后一次性提交整个批次,从而保持数据完整性?
最佳答案
是的。在 yieldIfContendedSafely()
中,Android 调用 setTransactionSuccessful()
、 endTransaction()
,并开始一个新事务——在这个过程中提交你的语句。没有机制可以在结束后回滚“真实”事务。
仅当有另一个线程在等待数据库时才会发生此行为,否则 yieldIfContendedSafely()
不执行任何操作。
我用以下场景检查了这一点。我启动了两个线程:一个使用事务将数据插入到表中,另一个从同一个表中读取数据。事务没有调用 setTransactionSuccessful()
,因此通常所有内容都在最后回滚,使表为空。我添加了对 yieldIfContendedSafely()
的调用,之后表不为空并且有来自事务的数据。
关于android - yieldIfContendedSafely() 是否会失去交易的好处?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9599809/