[Swift/Xcode] Realm: "Can only add, remove, or create objects in a Realm in a write transaction" 에러란?

luvoo·2021년 11월 5일
0

Swift

목록 보기
2/2

❗️에러 발생

Thread 1: "Can only add, remove, or create objects in a Realm in a write transaction - call beginWriteTransaction on an RLMRealm instance first."

Realm의 데이터를 변경하려고 할때 위와 같은 에러가 발생했다.

이 에러에 대해 구글링을 해보니 스택오버플로우에 자신이 바보같은 짓을 했다고 단 코멘트를 보았다.

이때 느꼈다..

아 내가 또 바보같은 짓을 했구나..

어떤 바보같은 짓인지 알아보도록 하자.

사실 에러 문구를 해석해보면 바로 알 수 있다.

Write Transaction 안에서만 add, remove, create를 할 수 있다는 것은 곧, 지금 wirte transaction이 없는채로 add, remove, create를 하고 있다는 뜻이다.

try! localRealm.write {
	localRealm.delete(tasks[indexPath.row])
}

localRealm.delete()만 덩그러니 있던 코드를 localRealm.write로 감싸주니 문제가 해결되었다.

✋Transaction?

그래서 Transaction이 뭔데?

분명 수업때 들었던거 같은데 약간 가물가물하다.

구글 선생님께 여쭤보자.

데이터베이스 트랜잭션(Database Transaction)은 데이터베이스 관리 시스템 또는 유사한 시스템에서 상호작용의 단위이다. 여기서 유사한 시스템이란 트랜잭션이 성공과 실패가 분명하고 상호 독립적이며, 일관되고 믿을 수 있는 시스템을 의미한다. <위키백과 - 데이터베이스 트랜잭션>

또한, Transaction은 데이터베이스의 논리적 작업 단위(LUW)라고 한다.

Transaction을 통해 데이터베이스의 완전성(Integrity)를 유지할 수 있게 한다는데...(정보처리기사를 준비할때도 한번 들어본 것 같다.)

이게 무슨 뜻이냐면, 하나의 Transaction 안에서 이루어지는 일이 실패하더라도 전체 데이터 베이스에는 영향을 미치지 않는다는 뜻이다.

실패한다면 자동으로 rollback하여 다시 원래의 데이터베이스로 돌아간다.

Realm에선 localRealm.write{ } Transaction 안에서 데이터의 삭제, 추가, 변경이 이루어진다.

데이터베이스가 어떻게 동작하는지 한번 더 복습해볼 필요가 있다.

MongoDB Realm 공식 문서도 한번 읽어보자.

Write Transactions - iOS SDK

0개의 댓글