구매자 계좌에서 만원 출금
판매자 계좌에 만원 입금
→ update - 구매자 계좌에서 만원 빼기, 판매자 계좌에 만원 더하기
→ 이 두 개의 업데이트문 처리 과정에서 서버 다운과 같은 오류가 발생할 수 있음
이를 방지하기 위해 나온 것이 트랜잭션
쿼리들을 하나의 트랜잭션으로 묶어서 해당 쿼리가 모두 실행되거나 아무 쿼리도 실행되지 않도록 함
데이터베이스가 데이터를 안정적으로 보장할 수 있게 함
하나의 트랜잭션은 커밋 혹은 롤백 됨
Atomicity(원자성) : 트랜잭션은 데이터베이스에 모두 반영되거나 전혀 반영되지 않아야 함(트랜잭션의 중간 상태를 DB에 반영하면 안 됨)
Consistency(일관성) : 트랜잭션 작업 처리 결과는 항상 일관성이 있어야 함. 데이터베이스는 항상 일관된 상태를 유지해야 한다.
Isolation(독립성) : 둘 이상의 트랜잭션이 동시에 실행되고 있을 때, 어떤 트랜잭션도 다른 트랜잭션의 연산에 끼어들 수 없음 (각각의 트랜잭션은 서로 간섭 없이 독립적으로 이루어져야 함)
Durability(지속성) : 트랜잭션이 성공적으로 완료되었으면 결과는 영구히 반영되어야 함
→ 트랜잭션이 이론적으로 보장해야 하는 성질. 성능을 위해 손실 보장이 완화되기도 함
read-uncommitted
read-committed
repeatable-read
serializable
→ 위로 갈수록 동시성이 높고 아래로 갈수록 데이터 정합성이 높음

→ 스프링에서 제공하는 트랜잭션 전파 타입