트랜잭션과 ACID
All or nothing(전부 반영되거나, 아무것도 반영되지 않아야 한다.)
원자성은 트랜잭션의 일부가 실패할 경우 전체 트랜잭션이 실패.
데이터베이스 상태가 변경되지 않은 상태로 유지되도록 보장합니다.
즉, 일부만 성공하는 상태는 존재해서는 안된다.
책 구매는 1. 책 비용을 지불. 2. 판매를 반영하도록 상점의 재고를 업데이트하는 2가지 단계.
원자성은 이 두 단계가 함께 완료되도록 보장합니다.
어떤 이유로 결제가 완료되었으나 재고 업데이트가 실패하는 경우(시스템이 충돌할 수 있음) 전체 거래가 전혀 발생하지 않은 것처럼 롤백됩니다. 즉, 계정에 비용이 청구되지 않으며 도서는 재고 목록에 그대로 남아 있습니다.
트랜잭션 이전과 이후에 데이터베이스는 항상 일관된 상태여야 한다는 규칙.
데이터는 미리 정의된 규칙에서만 수정이 가능해야한다.
Ex) 숫자컬럼에 문자열값을 저장이 안되도록 보장해줍니다.
If) 새 도서가 추가 => 전체 도서 수, 사용 가능한 도서 목록, 특정 카테고리의 도서 잔액 등 정보가 업데이트되어야한다.
일관성은 새 책이 추가될 때마다 이러한 모든 업데이트가 도서관의 규칙을 준수하도록 보장합니다.
업데이트의 일부가 이러한 규칙을 위반하는 경우 트랜잭션이 완료되지 않는다.
대변 차변
Ex) 총량이 늘어나거나 하는 사고는 안돼
데이터베이스를 어지럽히는건 안돼
여러 트랜잭션이 동시에 실행될 때에도, 혼자 실행되는 것처럼 동작하게 만들어야 한다.
즉, 동시에 실행되는 여러 트랜잭션은 서로 영향을 주지 않고 독립적으로 실행되는 것처럼 보여야 한다. => 연속으로 실행된것과 동일한 결과
격리성을 지키는 각 트랜젝션은 철저히 독립적이기 때문에 다른 트랜젝션의 작업 내용을 알 수 없으며, 트랜잭션이 동시에 실행될 때와 연속으로 실행될 때의 데이터베이스 상태가 동일해야 한다.
일반적으로 시스템이 격리를 유지하기 위해 처리해야 하는 dirty read , 반복 불가능한 읽기, 팬텀 읽기 등 여러 현상을 유발할 수 있는 락 메커니즘을 사용하여 구현됩니다.
두 사람이 동시에 "구매"를 클릭하더라도 데이터베이스는 거래를 차례로 처리하므로 티켓이 이중 판매되는 상황을 방지할 수 있습니다.
각각의 상태가 독립되어있다
한번 반영(커밋)된 트랜젝션의 내용은 데이터베이스에 영원히 적용되는 특성을 의미
영구적 저장이란 => 비휘발성 메모리(HDD, SSD 등)에 저장
정전, 충돌 또는 오류 등 DB 에 문제가 생겨도 커밋 결과는 쭉 남아있어야하도록!
ACID 트랜잭션의 장점
ACID 트랜잭션은 데이터 손실이나 데이터베이스를 일관성 없는 상태로 두지 않고 데이터베이스 시스템이 오류로부터 복구할 수 있도록 하는 프레임워크를 제공합니다.
이러한 신뢰성은 데이터 정확성과 가용성이 가장 중요한 은행, 의료, 전자 상거래 등의 산업에서 매우 중요합니다.
acid 를 부시지 않는 한에서 DB 를 커스텀해서
락을 느슨하게해서 성능을 올려.
Ex) 리드일때는 락 걸지말고, 업데이트일때도 연관된 레코드만 락을 걸고.
데이터 무결성을 지키기 위해서 ACID 로 무결성 가져가면서 + 성능도 챙겨야해 => 동시성 이슈
ex) 낙관적락, 비관적락.
JPA
@Transactional 은 락이 발생하기때문에 조심해서 써야해.
카프카
Quiz
C ,D
내구성 속성은 트랜잭션이 커밋되면 해당 변경 사항이 영구적이고 시스템 오류가 발생해도 유지되도록 보장