오늘 @Upsert 어노테이션을 사용해서 Collection 데이터를 넘겼을때 과연 "트랜잭션처리가 되는가?"에 대해서 검증해야할 일이 있었다. Room을 당연한듯이 사용하고는 했지만 너무 추상화되어있어서 내부 동작을 알지 못했다. 당연히- 트랜잭션처리가 될거라고, 되어야만 한다고 생각했지만, 어림짐작으로 그치지 않고 코드로 확실하게 보고싶었다.

안드로이드 빌드를 한번 끝내면 generated/build에 내 Dao이름 + _Impl 이름으로 Dao의 구현체에대한 Java Class가 생성되어있는 것을 볼 수 있다.

upsert 함수가 이렇게 트랜잭션으로 감싸져 있는것을 확인했고, Room에 대한 흐릿한 불신을 지울 수 있게 되었다.
@Override
public Object upsert(final List<? extends WhitelistTableEntity> entities,
final Continuation<? super List<Long>> $completion) {
return CoroutinesRoom.execute(__db, true, new Callable<List<Long>>() {
@Override
@NonNull
public List<Long> call() throws Exception {
__db.beginTransaction();
try {
final List<Long> _result = __upsertionAdapterOfWhitelistTableEntity.upsertAndReturnIdsList(entities);
__db.setTransactionSuccessful();
return _result;
} finally {
__db.endTransaction();
}
}
}, $completion);
}
반응형
'프로그래밍 > Android' 카테고리의 다른 글
| Emulator 루팅 방법 (0) | 2024.11.27 |
|---|---|
| Github Package를 이용한 라이브러리 배포방법 (0) | 2024.11.04 |
| [안드로이드] IllegalStateException: Storage for [...] is already registered 오류 해결방법 (0) | 2024.10.27 |
| [Compose] 빨간 점 시스템 만들기 (1) | 2024.10.20 |
| ManifestPlaceholder : 매니페스트에서 빌드 변수 사용하기 (1) | 2024.10.09 |