지난 시간에 이어서, 이번엔 트랜잭션(Transaction)에 대해 알아보겠습니다. Transaction은 Database의 작업 단위로, 기초이면서도 필수인 개념이라고 할 수 있습니다. Transaction의 특징과 관련 개념, 그리고 제어 방법들에 대해 알아보는 시간을 갖겠습니다.
Q: 트랜잭션(Transaction)을 설명해주세요.
DB 내에서 수행되는 작업의 최소 단위로, DB의 무결성을 유지하며 DB의 상태를 변화시키는 기능을 수행합니다. 하나 이상의 Query를 포함해야 하고, ACID라고 칭해지는 원자성, 일관성, 고립성, 지속성의 4가지 규칙을 따릅니다.
Q: 트랜잭션(Transaction)의 성질을 말씀해보세요.
ACID로 총 4가지가 있습니다.
- Atomicity로 원자성입니다. 한 트랜잭션의 연산들이 모두 성공하거나 반대로 전부 실패되는 성질을 말합니다. 작업 단위의 일부분만을 실행하지 않는다고 할 수 있습니다.
- Consistency로 일관성입니다. 트랜잭션이 성공적으로 완료 되면, 일관적인 DB 상태를 유지함을 의미합니다. 즉, 무결성 제약 조건을 항상 만족해야 합니다. 자료형 int가 string으로 변하거나 하면 안 된다는 뜻입니다.
- Isolation으로 독립성입니다. 둘 이상의 트랜잭션이 동시에 실행되는 경우, 서로의 연산에 영향을 끼치지 않음을 말하며, 수행 중인 트랜잭션은 완전히 완료가 될 때까지 다른 트랜잭션에서 그 결과를 참조할 수 없습니다.
- Durability로 영속성입니다. 성공적으로 완료된 트랜잭션의 결과는, 시스템이 꺼지거나 고장난다고 해도 영구적으로 반영되어야 합니다.
Q: 동시성 제어에 대해 말씀해주세요.
여러 개의 Transaction이 한 개의 데이터를 동시에 갱신(UPDATE)할 때 어느 한 transaction의 갱신이 무효화 될 수 있는데, 이를 갱신 손실이라고 합니다. 갱신 손실을 막기 위한 동작으로, transsaction이 동시에 수행될 때 일관성을 해치치 않도록 transaction의 데이터 접근을 제어하는 DBMS의 기능입니다.
데이터 수정 중엔 해당 데이터를 Lock하여 다른 transaction이 접근하지 못 하도록 하고, Lock이 걸린 데이터는 Unlock이 될 때까지 접근할 수 없습니다.
- 낙관적 동시성 제어 : 같은 데이터를 동시에 수정하지 않을 것으로 가정하는 것입니다. 데이터를 읽는 시점에 lock을 걸진 않지만 수정하는 시점에서 기존에 읽어온 데이터가 다른 사용자에 의해 변경되었는지 재검사가 필요합니다.
- 조회가 많은 곳에서 사용되지만, 변경이 있을 수 있으니 일관성 검사를 필요로 합니다.
- 비관적 동시성 제어 : 같은 데이터를 동시에 수정할 것으로 가정합니다. 데이터를 읽는 시점에서 lock을 걸고 조회, 갱신 완료 시까지 lock을 유지합니다.
- SELECT 시점에서 lock을 걸면, 무한 대기가 발생할 수 있습니다.
MSSQL-WITH(NOLOCK)
- SELECT 시점에서 lock을 걸면, 무한 대기가 발생할 수 있습니다.
Q: 트랜잭션 격리수준 종류에 대해 말씀해주세요.
동시에 여러 트랜잭션이 처리될 때, 특정 트랜잭션이 다른 트랜잭션에서 변경, 혹은 조회하는 데이터를 읽게 허용할지를 결정하는 것입니다.
- READ UNCOMMITTED (커밋되지 않은 읽기 허용)
Level 0
- 커밋되지 않은 데이터를 다른 트랜잭션이 조회할 수 있으며 이것을 Dirty read라고 합니다.
- 일관성 훼손
- 커밋되지 않은 데이터를 다른 트랜잭션이 조회할 수 있으며 이것을 Dirty read라고 합니다.
- READ COMMITTED (커밋된 읽기 허용)
Level
1
커밋한 데이터를 다른 트랜잭션에서 조회합니다. 따라서 Dirty Read는 방지할 수 있지만, NON-REPEATABLE READ와 Phantom READ는 발생할 수 있습니다. 주로 오라클에서 기본으로 사용되는 격리 수준이며, 온라인 서비스에서 가장 많이 선택되는 격리수준입니다.- NON-REPEATABLE READ : 한 트랜잭션에서 같은 쿼리를 2번 실행했을 때, 다른 값이 나오는 Read 현상을 말하는 것으로, 동일 트랜잭션에 여러 스냅샷이 사용되는 경우를 말합니다.
- PHANTOM READ : 한 트랜잭션 안에서 첫 번째 쿼리 수행 결과와 두 번째 쿼리 수행 결과가 다른 것을 나타내는 것이며, 외부에서 실행 중인 트랜잭션의 INSERT 작업에 의해 발생하는 READ현상을 말합니다. 즉, 결과 범위에 속하지 않는 레코드가 외부 작업에 의해 있을 수도 있고, 없을 수도 있다는 것을 뜻합니다.
- REPEATABLE READ (반복 가능한 읽기)
Level 2
- 한 번 조회한 데이터를 반복해서 조회해도 같은 데이터가 조회됨을 보장하는 격리수준입니다.
- SERIALIZABLE (직렬화 가능)
Level 3
- 가장 엄격한 트랜잭션 격리 수준으로, Dirty Read, Phantom Read 등의 모든 문제가 발생하지 않지만, 단순 SELECT 쿼리도 Lock이 걸릴 수 있어서, 동시성 처리 성능이 급격히 떨어질 수 있습니다.
Q: COMMIT과 ROLLBACK에 대해 말씀해주세요.
DB는 COMMIT과 ROLLBACK으로 데이터 무결성을 보장합니다.
COMMIT이란, transaction 작업을 완료했다고 확정하는 명령어로 실제 DB가 변경됩니다.
ROLLBACK은 작업 중 문제가 발생했을 때, transaction 처리 과정에서 발생한 변경 사항을 취소하고, 이전 COMMIT 상태로 되돌리는 것을 의미합니다.
마치며
이번 시간에는, 트랜잭션(Transaction)과 그에 대한 특성, 그리고 관련 개념들에 대해 알아보았습니다. 그중 동시성 제어와 격리 수준은 이후에 더욱 어려운 상위 개념과 웹 개발 시 꼭 필요한 개념으로 등장할텐데요, 이번 시간을 계기로 막힘 없이 공부할 수 있도록 잘 대비하시길 바랍니다.
다음 시간에는, 정규화(Normalization), 이상 현상이 있는 릴레이션을 분해하여 이상 현상을 없애는 과정에 대해 알아보도록 하겠습니다.
답글 남기기