본문 바로가기
카테고리 없음

[Transaction] 의미와 목적

by kkodecaffeine 2021. 8. 4.

시작하며;

현재 재직 중인 회사에서는 비즈니스 로직 단에서 Transaction 의 처리를 중요하게 보는 것 같다. 그래서 Transaction 이 무엇인지 그리고 무슨 목적으로 사용을 하는 건지 궁금하여 여기에 기록을 남겨둘까 한다.


 

Transaction 이란;

예를 들어, 게시판을 읽고 쓰고 삭제해볼게요. "읽기" 로직이 끝나고 다음 "쓰기" 로직이 시작된다. 그리고 이어서 "삭제" 로직이 수행되게 된다. 순차적으로 진행하다면 데이터의 무결성 등이 보장되지만 장기적으로 보면 솔루션/서비스의 속도는 느려질 것이다. DBMS 는 CPU 보다 I/O 작업을 더 빈번하게 수행되기 때문이다. 그래서 순차적으로 수행될수록 CPU 의 idle time 은 길어지고 서비스 제공하는 입장에서도 자연스레 최적의 성능을 제공할 수 없을 것이다.

 

그래서 동시에 여러 Transaction 을 수행시킨다면 성능적인 면에서 이점을 얻을 수 있겠지만 데이터베이스에 저장된 데이터의 무결성은 반드시 보장할 수는 없게된다. 다수의 사용자가 데이터베이스를 동시에 접근이 가능해지기 때문이다. 위와 같은 상황을 방지할 수 있는 .NET 에서 제공하는 속성 등을 알아보았다.

 

보통 조회할 때는 Service Layer 에서 TransactionScopeSuppressAsync 를 사용해서 다른 Transaction 을 보류시키고 현재 진행 중인 Transaction 을 수행하도록 했다. 그리고 데이터의 추가/수정/삭제 등을 수행할 때는 TransactionScopeRequiredAsync 를 사용했다.

 

데이터를 조회할 때의 Isolation level 은 READ_UNCOMMITTED 상태로 지정해두었다. commit 되지 않는 데이터에 대한 읽기를 허용한다. 이 때 임의의 사용자가 A 라는 데이터를 B 라는 데이터로 변경하는 동안 다른 사용자는 B 라는 아직 완료되지 않은 (Uncommitted 혹은 Dirty) 데이터 B 를 읽을 수 있다.

 

하지만 데이터를 추가/수정/삭제할 때는 commit 이 확정된 데이터만 읽기를 허용한다면, 먼저 선점한 사용자가 A 라는 데이터를 B 라는 데이터로 변경하는 동안 다른 사용자는 해당 데이터에 접근할 수 없게 된다.

 

Propagation

  • Required: 부모 트랙잭션 내에서 실행하며 부모가 없을 경우 새로운 트랙잭션 생성.
  • RequiredNew: 부모 트랜잭션을 무시하고 무조건 새로운 트랜잭션 생성.
  • Suppess: 이미 진행 중인 트랜잭션이 있으면 보류시킴.

❉ Ambient transaction: 환경 트랙잭션 혹은 현재 수행 중인 트랜잭션을 의미함.