
Android + Roomで複数テーブル間のトランザクションを張る
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