트랜잭션 스케줄링은 여러 트랜잭션이 동시에 실행될 때 각 트랜잭션 내의 오퍼레이션(읽기, 쓰기 등)이 어떤 순서로 실행되는지를 결정하는 과정입니다. 다양한 스케줄이 가능하며, 각 스케줄에 따라 데이터베이스의 최종 상태가 달라질 수 있습니다.
예를 들어, 다음과 같은 두 개의 트랜잭션이 있다고 가정해 봅시다:
이 두 트랜잭션이 실행될 때 다음과 같은 시나리오가 가능합니다:
실행 순서에 따라 데이터베이스의 최종 상태가 달라질 수 있으며, 때로는 예상치 못한 결과가 발생할 수 있습니다. 예를 들어, 30만원이 입금되었음에도 불구하고 최종적으로 계좌에 반영되지 않는 상황이 발생할 수 있습니다. 이러한 현상을 로스트 업데이트(Lost Update)라고 합니다.
시리얼라이저빌리티는 여러 트랜잭션이 동시에 실행되더라도 그 결과가 시리얼 스케줄(각 트랜잭션이 순차적으로 실행되는 스케줄)과 동일함을 보장하는 특성입니다. 즉, 겹쳐서 실행된 트랜잭션들의 결과가 하나씩 순차적으로 실행된 것과 같다면, 해당 스케줄은 시리얼라이저블(Serializable)하다고 할 수 있습니다.
시리얼라이저블 스케줄은 두 가지로 구분됩니다:
시리얼 스케줄은 안전하지만 성능이 떨어질 수 있습니다. 반면, 논시리얼 스케줄은 성능은 좋지만 잘못된 결과를 초래할 수 있습니다.
컨플릭트 시리얼라이저빌리티는 스케줄이 시리얼라이저블한지를 확인하는 방법 중 하나입니다. 이는 스케줄 내의 컨플릭트(Conflict) 오퍼레이션들의 순서를 기준으로 합니다. 컨플릭트 오퍼레이션은 다음 조건을 만족하는 두 오퍼레이션을 의미합니다:
두 스케줄이 동일한 트랜잭션을 포함하고, 모든 컨플릭트 오퍼레이션의 순서가 동일하다면, 이 두 스케줄은 컨플릭트 이퀴발런트(Conflict Equivalent)하다고 합니다. 그리고 이런 스케줄은 컨플릭트 시리얼라이저블(Conflict Serializable)하다고 할 수 있습니다.
시리얼라이저빌리티는 트랜잭션의 일관성을 유지하는 중요한 속성입니다. 하지만 모든 스케줄을 시리얼라이저블하게 유지하려고 하면 성능이 저하될 수 있습니다. 따라서 DBMS는 트랜잭션의 아이솔레이션 레벨(Isolation Level)을 제공하여, 상황에 맞게 동시성과 일관성 사이의 균형을 조절할 수 있게 합니다.
https://www.youtube.com/watch?v=aL0XXc1yGPs&list=PLcXyemr8ZeoREWGhhZi5FZs6cvymjIBVe