Android Room的withTransaction块执行完成后才会执行下一行代码吗?
关于Room withTransaction 执行顺序的解答
首先先看你给出的代码示例:
class MyViewModel(private val db: AppDatabase): ViewModel() { suspend fun insertAndRead(pages: List<Page>) { db.withTransaction { db.pageDao().insertAll(pages) } val pagesInserted = db.pageDao().selectAll() } }
结论
Room 会完全等待withTransaction块执行结束、事务提交完成后,才会执行后续的查询代码,不会出现事务没跑完就提前执行下一行的情况。
原因说明
- Room 提供的
withTransaction本身是标准的Kotlin挂起函数,遵循协程的执行逻辑:调用挂起函数时,会暂停当前协程的执行流,直到挂起函数内部所有逻辑执行完毕,才会恢复协程继续执行后续代码。 withTransaction内部会完成「开启事务、执行你传入的lambda块逻辑、提交事务」的全流程,只有当事务提交成功(如果执行过程中出现异常会自动回滚),整个withTransaction挂起函数才会返回,才会走到下一行的查询逻辑。- 你这段代码里的查询逻辑必然能读到刚插入的所有Page数据,不存在事务未提交读不到新数据的问题。
常见误区澄清
不要把挂起函数和异步并发搞混:只有你手动通过launch、async等方法启动新的子协程时,才会出现和父协程并发执行的情况。单独调用挂起函数不会改变代码的顺序执行逻辑,执行顺序和普通同步代码完全一致。
内容的提问来源于stack exchange,提问作者flamyoad
相关产品推荐
相关产品推荐

