You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 01:54:04