아삭아삭 iOS 개발

[위클리 발표] Happy Realming 🤗(2)_Transacition 본문

카테고리 없음

[위클리 발표] Happy Realming 🤗(2)_Transacition

바닐라머스크 2022. 12. 20. 18:15

 

지난 포스팅에서의 Realm Threading 유의사항 3가지에 이어서

이번 포스팅에서는 Transacition에 대한 정의와 특징, 그리고 realm에서의 특징에 대해 알아보겠습니다.

 

Part1) Overview

  1. realm 사용시 background로 작업의 필요성

  2. realm multithreaded 작업시 주의사항 (규칙 3가지)

  3. Transaction의 정의 및 특징


 

지난 시간에 이어 갑자기 transaction에 대한 얘기로 왜 흘러가는지 궁금하실 수 있는데요,

바로 transaction의 특징들이 바로 지난번의 realm threading 유의사항 3개에 대한 설명이 될 수 있기 때문입니다.

 

(1) Transaction 이란?

Transaction이란 한마디로 작업 수행의 논리적인 단위입니다.

 

(2) Transaction 특징

특징1) 질의(query)를 하나의 묶음 단위로 처리할 때에는 rollback 아니면 commit 두 종류의 결과만 나오게 되는데요,

이 말은 전부 처리되거나 아니면 아예 하나도 처리되지 않고 다시 처음부터 질의를 실행하게 되는 결과는 의미합니다.

(그 이유는 아래 송금예시와 함께 설명)

 

특징2) 또한 데이터를 읽거나 쓸 때 다른 Transaction들이 접근을 하지 못하도록 잠그는 특징이 있습니다.

 

(3) Transaction의 필요성

은행에서의 "송금"을 예시로 들어보겠습니다.

 

송금 작업을 하나의 Transaction이라고 한다면, 이 Transaction은 인출 연산작업과 입금 연산작업이라는 묶음을 갖는 하나의 논리적인 작업 단위로 볼 수 있습니다.

 

(발표 슬라이드 중 일부) Transaction 정의와 특징

 

A라는 사람이 B에게 100만원을 송금한다고 가정해봅시다.
A계좌에서는 100만원이 차감될 것이고, B계좌에서는 100만원이 추가되는 작업이 순차적으로 이루어질 것입니다.
만약 차감작업은 성공했지만 추가되는 작업이 실행되지 않고 송금 Transaction이 종료된다면, 
A와 B의 계좌금액을 확인해보았을 때 (송금작업 전과 비교시)100만원이 공중으로 사라져버리는 데이터 부정합의 상황이 발생하게 됩니다.

 

위와 같은 상황이 발생하지 않도록 하기 위해서 Transaction의 특징인 rollback 아니면 commit 두 종류의 결과만 도출되게 되는 것이죠!

송금 작업이 성공해서 100만원 차감과 추가가 모두 실행되거나(Commit) 아니면 아예 아무 작업도 일어나지 않은 상태가 되도록 하는(Rollback) 둘 중 하나로만 결과가 나와야 하는 것입니다.

 

즉, 중간까지만 실행하고 실패함으로 인한 데이터 불일치가 발생하는 일이 없어야 합니다.

 

(발표 슬라이드 중 일부) Transaction은 ACID 성질을 충족한다

 

그래서 Transaction은 작업의 안정성데이터의 무결성을 유지시키기 위한 ACID 성질을 갖고 있습니다.

(해당 키워드에 대한 각각의 상세내용은 별도의 포스팅으로 다루겠습니다~)

 

 

(4) Realm에서의 Transaction과 특징

Transaction이 작업수행의 논리적인 단위이므로 realm에서는 CRUD를 수행하는 write메서드들의 묶음을 Transaction로 이해할 수 있습니다.

아래는 realm에서의 write메서드 정의 코드입니다.

 

realm의 write definition 캡처

특징1) 코드를 확인해보면 우선 write작업은 동기적으로 작동함을 알 수 있습니다.

 

특징2) 그리고 작업처리의 결과는 rollback 아니면 commit 두 가지로 나올 수 있습니다.
- 작업이 성공할 경우, commitWrite()이 호출되고
- block이 에러를 던지게 된다면 cancelWrite()이 호출되며 transaction은 취소되고 error이전에 발생한 변경사항들은 롤백됩니다.

 

특징3) realm에서는 UI thread와 background thread에서 동시에 transaction을 여는 상황은 피해야 합니다.
데이터를 읽거나 쓸 때 다른 transaction이 접근하지 못하도록 잠그려는 특성과 연결됩니다!
- 만약 다른 작업들이나 thread들을 통해 동일한 realm 파일의 realm 인스턴스에 대해 write메서드를 호출한다면
   → 현재 작업중인 write transaction이 완료되거나 취소될때까지 block될 것입니다.

     (앱의 반응성이 없는 상태로 인해 사용자가 앱 사용에 대해 부정적인 경험이 남을 수도 있으니 이런 상황은 피해야 겠죠?!)

 

 

다음 포스팅에서는 realm의 background write에 대한 내용으로 이어가겠습니다 :)

 

< 참고자료 >

https://www.mongodb.com/docs/realm/sdk/swift/crud/create/

 

CRUD - Create - Swift SDK — Realm

Say we decide to manage a table view's data source manually, because our app design requires an instantaneous response to UI-driven table updates. As soon as a user adds an item to the table view, we insert it to our data source, which writes to the realm

www.mongodb.com