Загружаем каталог…
Загружаем каталог…
1. 트랜잭션은 왜 필요할까? A가 B에게 돈을 송금한다고 가정해보자. A에서 B에게 송금하려면 다음 두 과정이 필요하다. 1. A 계좌의 돈을 차감한다. 2. 차감한 금액을 B 계좌에 입금한다. 그런데 A 계좌의 돈이 차감된 직후 서버 오류가 발생해 B 계좌에 돈이 입금되지 않는다면 문제가 생긴다. 물론 A 계좌의 차감 작업 자체는 정상적으로 처리된 것 이라고 볼 수 있다. 하지만 우리가 원하는 것은 단순히 A 계좌의 돈을 줄이는 것이 아니라, A에서 B로 송금하는 것 이다. 송금은 두 과정이 모두 성공해야 완료된 것이기 때문에, 하나만 성공했다면 결과적으로 전체 송금은 실패한 것이다. 여러 작업 중 일부만 처리되어 데이터가 잘못된 상태로 남는 것을 막기 위해 트랜잭션이 필요하다. 2. 트랜잭션이란? 위의 송금 예제에서 A 계좌의 잔액을 줄이는 작업과 B 계좌의 잔액을 늘리는 작업은 각각 별개의 데이터베이스 작업이다. 하지만 실제 서비스에서는 두 작업을 합쳐 하나의 '송금' 으로 본다. 이처럼 여러 데이터베이스 작업을 하나의 논리적인 작업 단위로 묶어 처리하는 것 을 트랜잭션이라고 한다. 트랜잭션으로 묶인 작업은 일부만 성공한 상태로 끝나는 것이 아니라, 전체가 성공하거나 전체가 실패하도록 처리하는 것이 중요하다. 3. COMMIT과 ROLLBACK 트랜잭션으로 여러 작업을 하나로 묶었다면, 작업 결과를 최종적으로 반영할지 취소할지 결정해야 한다. COMMIT COMMIT 은 트랜잭션 안에서 수행한 작업을 최종적으로 반영하는 것 이다. A 계좌 -10,000원 성공 B 계좌 +10,000원 성공 ↓ COMMIT ↓ 변경 내용 최종 반영 즉, 송금이 정상적으로 끝났다면 COMMIT 을 통해 DB에 결과를 확정한다. ROLLBACK 반대로 ROLLBACK 은 트랜잭션을 처리하는 도중 문제가 발생했을 때, 해당 트랜잭션에서 수행한 변경을 취소하고 이전 상태로 되돌리는 것 이다. A 계좌 -10,000원 성공 B 계좌 +10,000원 실패 ↓ ROLLBACK ↓ A 계좌 차감도 취소 이렇게 되면 최종적으로는 송금 전 상태로 돌아가게 된다. COMMIT 은 변경 내용을 확정하고, ROLLBACK 은 해당 트랜잭션에서 수행한 변경을 취소한다. 4. ACID 트랜잭션이 신뢰할 수 있게 동작하기 위해서는 몇 가지 성질을 보장해야 한다. 이를 대표적으로 ACID 라고 한다. ACID = Atomicity + Consistency + Isolation + Durability Atomicity — 원자성 하나의 트랜잭션에 포함된 작업은 모두 성공하거나 모두 실패해야 한다 는 의미이다. 쉽게 말하면 All or Nothing 이다. 앞에서 본 송금 예제를 생각해보면, A 계좌의 차감 작업 자체는 성공했더라도 B 계좌에 입금되지 않았다면 송금 전체는 실패한 것이다. A 계좌 -10,000원 성공 B 계좌 +10,000원 실패 ↓ 송금 전체 실패 즉, 일부 작업만 성공한 상태로 끝나는 것이 아니라 모든 작업이 함께 성공하거나 함께 실패해야 한다. Consistency — 일관성 트랜잭션을 수행하기 전과 후에도 데이터가 정해진 규칙을 만족해야 한다 는 의미이다. 예를 들어 데이터베이스에 다음과 같은 규칙이 있다고 해보자. 계좌 ID는 중복될 수 없다. 존재하지 않는 계좌를 참조할 수 없다. 트랜잭션이 실행되었다고 해서 이런 규칙이 깨진 데이터가 만들어져서는 안 된다. 정상적인 DB 상태 ↓ 트랜잭션 실행 ↓ 정상적인 DB 상태 즉, 데이터가 지켜야 할 규칙은 트랜잭션 전후에도 유지되어야 한다. Isolation — 격리성 동시에 실행되는 여러 트랜잭션이 서로 함부로 영향을 주지 않도록 하는 성질 이다. 실제 서버에서는 하나의 트랜잭션만 실행되는 것이 아니라 여러 사용자가 동시에 주문하고, 송금하고, 데이터를 수정할 수 있다. 사용자 A의 트랜잭션 ─┐ ├→ 동시에 DB 사용 사용자 B의 트랜잭션 ─┘ 이때 한 트랜잭션이 처리되는 도중 다른 트랜잭션의 작업 때문에 결과가 이상해지는 것을 막을 필요가 있다. 이번 글에서는 격리 수준까지는 다루지 않고, 여러 트랜잭션이 동시에 실행될 때 서로의 작업에 영향을 주지 않도록 해야 한다 는 정도로 이해했다. Durability — 지속성 트랜잭션이 성공해서 COMMIT 까지 완료되었다면 그 결과가 유지되어야 한다 는 의미이다. 예를 들어 A에서 B로 송금이 완료된 뒤 COMMIT 까지 끝난 상태에서 서버 장애가 발생했다고 해보자. A → B 송금 성공 ↓ COMMIT ↓ 서버 장애 발생 ↓ 서버 다시 시작 ↓ 송금 결과는 그대로 유지 COMMIT 까지 완료했는데 서버를 다시 시작한 뒤 송금 기록이 사라진다면 데이터베이스를 신뢰하기 어렵다. 따라서 성공적으로 완료된 트랜잭션의 결과는 장애가 발생하더라도 보존되어야 한다. ACID 한눈에 간단히 이해하기 특성 의미 Atomicity 전부 성공하거나 전부 실패 Consistency 작업 전후에도 데이터 규칙 유지 Isolation 동시에 실행돼도 서로 함부로 간섭하지 않음 Durability COMMIT 된 결과는 계속 보존 5. 직접 실행해보기 앞에서 이해한 COMMIT 과 ROLLBACK 을 간단한 SQL로 직접 확인해봤다. 먼저 계좌 정보를 저장할 테이블을 만들었다. CREATE TABLE account ( id BIGINT PRIMARY KEY, name VARCHAR(20), balance INT ); 그리고 A와 B 계좌의 초기 데이터를 추가했다. INSERT INTO account VALUES (1, 'A', 50000); INSERT INTO account VALUES (2, 'B', 10000); COMMIT A 계좌에서 10,000원을 차감하고 B 계좌에 10,000원을 추가한 뒤 COMMIT 을 실행했다. START TRANSACTION; UPDATE account SET balance = balance - 10000 WHERE id = 1; UPDATE account SET balance = balance + 10000 WHERE id = 2; COMMIT; 결과는 다음과 같다. A : 50000 → 40000 B : 10000 → 20000 COMMIT 을 실행했기 때문에 트랜잭션에서 수행한 변경 내용이 최종적으로 반영되었다. ROLLBACK ROLLBACK 도 확인하기 위해 계좌 잔액을 다시 처음 상태인 A 50,000원, B 10,000원으로 되돌린 뒤 같은 작업을 진행했다. START TRANSACTION; UPDATE account SET balance = balance - 10000 WHERE id = 1; UPDATE account SET balance = balance + 10000 WHERE id = 2; ROLLBACK; ROLLBACK 을 실행하면 트랜잭션 안에서 수행했던 변경이 취소된다. A : 50000 B : 10000 즉, COMMIT 은 변경 내용을 확정하고 ROLLBACK 은 해당 트랜잭션에서 수행한 변경을 취소한다는 것을 직접 확인할 수 있었다. 6. 정리 트랜잭션이 중요하다는 말은 많이 들었지만, 정확히 왜 필요한지에 대해서는 잘 알지 못했다. 이번에 송금 예제와 COMMIT , ROLLBACK , ACID를 정리하면서 트랜잭션이 단순히 여러 SQL을 묶는 기능이 아니라, 여러 작업 중 일부만 처리되어 데이터가 잘못된 상태로 남는 것을 막기 위해 필요한 개념이라는 것을 알게 되었다. 아직 트랜잭션을 깊게 공부한 것은 아니지만, 이번 정리를 통해 기본적인 개념과 왜 중요한지는 어느 정도 이해할 수 있었다. 앞으로 데이터베이스와 Spring/JPA를 더 공부하면서 트랜잭션이 실제 애플리케이션에서 어떻게 사용되고 동작하는지도 더 깊게 공부해볼 예정이다.
То, что RADAR обнаружил и классифицировал для этой возможности. Это опубликованный источником текст, а не подтверждение, что предложение ещё действует.
트랜잭션은 왜 필요할까? - COMMIT, ROLLBACK부터 ACID까지. 1. 트랜잭션은 왜 필요할까? A가 B에게 돈을 송금한다고 가정해보자. A에서 B에게 송금하려면 다음 두 과정이 필요하다. 1. A 계좌의 돈을 차감한다. 2. 차감한 금액을 B 계좌에 입금한다. 그런데 A 계좌의 돈이 차감된 직후 서버 오류가 발생해 B 계좌에 돈이 입금되지 않는다면 문제가 생긴다. 물론 A 계좌의 차감 작업 자체는 정상적으로 처리된 것 이라고 볼 수 있다. 하지만 우리가 원하는 것은 단순히 A 계좌의 돈을 줄이는 것이 아니라, A에서 B로 송금하는 것 이다. 송금은 두 과정이 모두 성공해야 완료된 것이기 때문에, 하나만 성공했다면 결과적으로 전체 송금은 실패한 것이다. 여러 작업 중 일부만 처리되어 데이터가…
Открыть источник