当后台服务中的多个suspend函数同时使用Android Studio中的Room更新SQLite DB的不同行时,会发生什么?

czfnxgou  于 2023-05-23  发布在  SQLite
关注(0)|答案(2)|浏览(215)

bounty还有2天到期。回答此问题可获得+50声望奖励。HelloCW正在寻找一个答案从一个有信誉的来源

在我的Android Studio项目中,我使用SQLite和Room进行数据库操作。后台服务包含几个暂停函数,负责更新SQLite数据库中的行。
考虑到SQLite应用了表级锁,这就提出了一个问题,即当多个挂起函数试图同时更新同一SQLite数据库的不同行时会发生什么。
SQLite数据库是否会被锁定,从而导致应用程序崩溃?

cetgtptt

cetgtptt1#

使用Room,您将能够一次更新多个列。但是,请记住,如果您的id列表包含超过999个项目,则可能会引发异常:
SQLiteException: too many SQL variables (Sqlite code 1)

5gfr0r5j

5gfr0r5j2#

当多个挂起函数试图同时更新同一SQLite数据库的不同行时。
挂起函数不是独立的线程;它们只是提供允许不同任务在协同程序中并发运行的延续。并发运行并不意味着简洁地/并行地运行,而是以连续的方式(异步地)运行一小段时间。
因此,如果您在同一协程/作业中的多个挂起函数中使用Room更新不同的行;它们实际上并不是同时运行的。
但是,您担心的是,当您在不同的线程(不同的协程调度程序)中运行这些更新时;一般来说,有些数据库系统限制在多个线程中同时使用同一个数据库连接; Room不会,Room会处理这个问题,因为它是线程安全的,并且是support multithreaded
幸运的是,Room是线程安全的,并且在单独的独立数据库Transaction(Documentation Reference)中运行每个用Room CRUD注解注解的Dao方法。

相关问题