Androidの実装でSQLite + Roomを利用する際、複数テーブル間でトランザクションを張ることがあったのでその備忘録です。
環境
Kotlin 1.5.10
Room 2.3.0
実装方法
AppDataBase.runInTransaction
ブロック内で更新処理を行うことで実現できます。
private val database: AppDataBase = application.database private val scope = CoroutineScope(Dispatchers.IO) try { database.runInTransaction { // userテーブル更新 userRepository.update(userData) // itemテーブル更新 itemRepository(itemData) } } catch (e: Exception) { /* error handling */ }
ブロック内でsuspend functionを利用する場合は、runInTransaction
の代わりにwithTransaction
を利用する必要があります。
try { database.withTransaction { // userテーブル削除 (suspend function) userRepository.delete(userData) // itemテーブル削除 (suspend function) itemRepository.delete(itemData) } } catch (e: Exception) { /* error handling */ }
参考記事
https://stackoverflow.com/questions/48113259/room-database-transaction-rollback
https://stackoverflow.com/questions/63677245/suspend-method-inside-runintransaction-block