트랜잭션이란, 데이터베이스에서 하나의 논리적인 작업 단위를 의미합니다.
일련의 작업이 모두 성공하거나, 하나라도 실패하면 전체가 롤백되는 원자성을 보장하는 개념입니다.
트랜잭션은 데이터의 일관성과 무결성을 유지하는데 중요한 역할을 합니다.
예를 들어, 은행 계좌 이체 시, 송금 계좌에서 돈이 출금되고 수신 계좌에 입금되는 과정이 하나의 트랜잭션으로 처리되지 않으면, 일부만 반영되어 데이터 불일치가 발생할 수 있습니다.
ACID는 트랜잭션이 안전하게 수행되기 위한 4가지 핵심 속성을 의미합니다.
트랜잭션이 성공적으로 완료되었음을 데이터베이스에 확정하는 연산.
commit 이후에는 변경사항이 영구적으로 반영됩니다.
트랜잭션 수행 중 오류가 발생하거나 문제가 생겼을 때, 이전 상태로 되돌리는 연산입니다.
세이프 포인트는 트랜잭션 내에서 특정 시점에 저장점을 설정하여, 필요 시 해당 점까지 롤백할 수 있도록 하는 기능입니다.
ex) 여러개의 계좌로 송금하는 트랜잭션을 수행할 때, 일부 계좌의 송금이 실패했을 때 전체 송금을 롤백하는 것이 아니라 실패한 부분만 롤백하고 나머지는 유지할 수 있도록 세이브 포인트를 설정할 수 있습니다.
트랜잭션 격리 수준은 여러 트랜잭션이 동시에 실행될 때, 각 트랜지션이 서로에게 미치는 영향을 조정하는 설정입니다.
SQL에서는 4가지 격리 수준을 정의하고 있으며, 낮은 수준일수록 성능이 향상되지만, 데이터 일관성 문제가 발생할 수 있습니다.
더티 리드는 하나의 트랜잭션에서 아직 커밋되지 않은 다른 트랜잭션의 데이터를 읽는 현상이다.
이후에 해당 트랜잭션이 롤백되면 읽은 데이터는 유효하지 않은 값이 될 수 있다.
예를들면,
=> 해결방법: Read Committed 이상의 격리 수준을 적용하여 커밋된 데이터만 읽도록 설정한다.
반복 불가능한 읽기는 하나의 트랜잭션에서 같은 데이터를 여러 번 읽을 때,
중간에 다른 트랜잭션이 값을 변경하여 서로 다른 결과가 나오는 문제이다.
=> 기존 데이터의 값이 변경되거나 삭제되어 다른 조회 결과가 나오는 것(DELETE, UPDATE)
예를 들면,
=> 해결방법: Repeatable Read 이상의 격리 수준을 적용하여 동일 트랜잭션 내에서는 데이터가 변경되지 않도록 보장한다.
팬텀리드는 한 트랜잭션이 특정 조건으로 데이터를 조회한 후, 다른 트랜잭션이 새로운 데이터를 추가하거나 삭제하여 같은 조회 시 결과가 달라지는 현상이다.
=> 기존 데이터의 값이 추가되거나 삭제되어 조회 결과 행 개수가 달라지는 것 (DELETE, INSERT)
=> 해결 방법: Serializable 수준의 격리 수준을 적용한다.