7장 트랜잭션-3

Dltmd202·2024년 8월 14일
post-thumbnail


Serializable

어떤 경쟁 조건은 Read Commited나 Repeatable Read에서 방지되지만 그렇지 않은 경우도 있다.

이를 위한 연구자들의 답변은 Serializable를 사용하라는 것이다.

그렇게 하면 여러 트랜잭션이 병렬로 실행되더라도 최종 결과는 동시성 없이 한 번에 하나씩 직렬로 실행됨을 보장한다. 즉, 데이터베이스가 발생할 수 있는 모든 경쟁 조건을 막아줄 수 있다.

실제적 Serializable

동시성 이슈를 피하는 가장 간단한 방법은 동시성을 제거하는 것이다. 한 번에 트랜잭션 하나씩만 직렬로 단일 스레드에서 실행하면 된다.

최근 연구자들은 단일 스레드 루프에서 트랜잭션을 실행하는 게 실현 가능하다고 결론내렸다.

트랜잭션을 순차적으로 실행하는 대표적인 데이터베이스는 Redis, HBase 등이 있다.

트랜잭션을 스토어드 프로시저 안에 캡슐화하기

DB가 등장한 초창기에는 데이터베이스 트랜잭션이 사용자 활동의 전체 흐름을 포함할 수 있게 하려는 의도가 있었다.

데이터베이스 설계자들은 전체의 과정이 하나의 트랜잭션으로 표현되고 원자적으로 커밋하면 깔끔할 것으로 생각했다. 하지만 사람들이 무언가를 결정하는 것도 반응하는 것도 매우 느리다. 데이터베이스 트랜잭션이 사용자의 입력을 기다려야 한다면 데이터베이는 대부분 idle 상태지만, 또 많은 수의 트랜잭션을 동시에 지원해야 한다.

애플리케이션에서 쿼리를 실행해 그 결과를 읽고, 쿼리 결과에 따라 다른 쿼리를 실행할 수 도 있는 구조이기 때문에 애플리케이션 코드와 DB 사이에서 빈번하게 쿼리 결과를 주고받게 된다. 이러한 상호작용식 트랜잭션은 애플리케이션과 데이터베이스 사이의 네트워크 통신에 많은 시간을 소비한다. 이런 상황에서 쓸만한 성능을 언드려면 여러 트랜잭션을 동시에 처리할 필요가 있다.

이를 회피하기 위해 트랜잭션을 Serializable로 처리하는 시스템은 다중 구문의 트랜잭션을 지원하지 않는다. 대신에 스토어드 프로시저 형태로 처리해야한다. 이렇게 하면 트랜잭션에 필요한 데이터는 모두 메모리에 있고 스토어드 프로시저는 IO 없이 빠르게 처리할 수 있다.

0개의 댓글