데이터를 일관된 흐름으로 수정하기 위한 자동 잠금
DB에 관한 책을 살짝 읽은 적이 있었는데 그때 처음 트랜잭션이라는 용어를 접했었고, 책에서는 예시로 은행DB 가 나왔었다. 여러 자료를 찾아보아도 확실히 트랜잭션에 대한 설명에는 계좌정보 변경이 자주 등장하는 것 같다. 트랜잭션이라는 용어의 의미로 추측해보자면 아마 실제로도 은행 DB를 관리하다가 처음 등장한 단어가 아닐까 싶다. 나는 DB 관리를 공부한 적이 없고, 일을 하면서 DB정보를 직접 변경할 일이 전혀 없기 때문에 우리 서비스에도 트랜잭션으로 관리되는 작업이 있는지 몰랐다.
관계형 데이터베이스에서 연산(쿼리)은 테이블의 행과 열을 Key 를 통해 조회하고 수정 및 삭제하는 행위를 가리킨다. 데이터는 중복 저장과 백업을 통해 원본과 무결하게 유지하는 것도 중요하지만, 쉼없는 연산들을 통해 계속해서 각각의 데이터값이 달라지기 때문에 각각의 시점에서 이전버전과 달라지는 흐름이 일관되게 유지되는 것도 아주 중요하다. 테이블에 변화를 가하는 작업은 완전히 성공하거나, 원상복귀되는 두가지의 결과만 가져야 하며, 중간에 멈춰서는 안된다. 데이터 변경 흐름의 일관성을 유지하기 위함이다. 이렇게 더 잘게 쪼개어 진행할 수 없는 작업의 단위를 트랜잭션이라고 한다.
한 라이더가 공유킥보드를 대여하기로 마음을 먹고 이용하기를 누르는 순간, 대여절차가 시작된다. 로그인을 했는지 확인하고, 결제수단과 면허증 정보가 있는지를 확인하고 모든 조건이 만족되었으면 서버는 DB 에서 해당 킥보드의 상태를 이용중으로 변경한다. 킥보드의 상태가 이용중인지 대기중인지는 일관된 흐름으로 관리되어야 하는 정보이다. 그렇기 때문에 트랜잭션으로 관리할 이유가 충분하다.
트랜잭션이 시작되면 테이블의 해당 행렬은 일시적으로 락이 걸려 트랜잭션이 끝날 때까지 데이터에 수정을 가할 수 없게 된다. 정상적으로 일련의 연산들이 완료된다면 킥보드의 운행상태는 이용중으로 무사히 바뀌고, 라이더는 즐겁게 라이딩을 시작할 수 있을 것이다. 그러나 연산처리 도중 해결해야할 오류가 발생한다면 즉각 트랜잭션은 중단되고 킥보드의 상태는 다시 처음상태인 대기중으로 돌아가며, 라이더의 이용기록도 생성되지 않는다. 거래가 무효화되는 것이다. 그러면 라이더는 팝업의 안내에 따라 재대여를 시도해볼 수 있을 것이다.
또 한가지 주워들은 것이 있는데, 바로 데드락. 교착상태이다. 킥보드 AA1234 기기의 대여 과정에서, 변경해야하는 데이터가 운행상태 말고 몇 가지가 더 있는 상황을 생각할 수 있다. 가령 킥보드 이용이 시작되면 휴대폰 거치대가 핸들 아래로 접혀있다가 자동으로 위로 올라와야 한다고 가정해보자. 거치대상태 변경 작업을 운행상태 변경이 일어나는 트랜잭션의 일부로 넣어야 할까? 거치대를 펼치는 일이 그렇게까지 필수적일까? 거치대가 안 펼쳐지면 이용 자체를 막아야할 만큼? 지금 생각으로는 그렇지 않을 것 같다. 그러면 이 작업은 운행상태 변경 트랜잭션이 끝난 후 처리하도록 하는 것이 좋을 것 같다.
거치대상태 변경도 별도의 트랜잭션으로 처리할 수도 있을 것이다. 이때 중요한 것은 AA1234 기기 테이블의 행과 열은 서로 다른 트랜잭션들에 의해서 동시에 변경될 수는 없다는 것이다. 두개의 변경이 동시에 일어나도록 작업을 설계한다면 데드락(교착상태)이 발생한다. 서로 같은 테이블을 잠그고 작업을 수행하려고 하기 때문에 이 두 작업은 영원히 이 상태에 머물게 되고, 각자의 트랜잭션은 절대 완료될 수 없다.
참고자료
< 미래를 바꾼 아홉가지 알고리즘 > - 존 맥코믹
< Temporal Consistency of Integrity-Ensuring Computations and Applications to Embedded Systems Security > - Xavier Carpent University of California, Irvi
https://dl.acm.org/doi/pdf/10.1145/3196494.3196526
< 데이터베이스 > - 위키백과
https://ko.wikipedia.org/wiki/%EB%8D%B0%EC%9D%B4%ED%84%B0%EB%B2%A0%EC%9D%B4%EC%8A%A4
TMI 1.
나의 무지는 동료에게 짐을 지워주는 행위이다.
자신의 몫은 스스로 알아내야 한다.
동료의 휴식시간을 벌어주도록 하자.
TMI 2.
피드백은 언제나 환영입니다. 저는 정확하게 알고 있는 지식이 가장 좋은 지식이라고 생각합니다 :)