Spring ‐ 트랜잭션 - dnwls16071/Backend_Study_TIL GitHub Wiki
📚 트랜잭션 개념
-
트랜잭션 ACID
- 원자성(Atomicity) : 트랜잭션 내에서 실행한 작업들은 마치 하나의 작업인 것처럼 모두 성공하거나 모두 실패해야 한다.
- 일관성(Consistency) : 모든 트랜잭션은 일관성 있는 데이터베이스 상태를 유지해야 한다.
- 격리성(Isolation) : 동시에 실행되는 트랜잭션들이 서로에게 영향을 미치지 않도록 격리해야 한다.
- 지속성(Durability) : 트랜잭션을 성공적으로 끝내면 그 결과가 항상 기록되어야 한다.
-
트랜잭션의 격리 수준(Isolation Level)
- READ UNCOMMITED(커밋되지 않은 읽기)
- READ COMMITED(커밋된 읽기)
- REPEATABLE READ(반복 가능한 읽기)
- SERIALIZABLE(직렬화 가능)
📚 데이터베이스 연결 구조와 DB 세션
- DB 서버는 내부에 세션을 만들고 앞으로 해당 커넥션을 통한 모든 요청을 해당 세션을 통해 실행한다.
- 개발자가 클라이언트(WAS나 DB 접근 툴)를 통해 SQL을 전달하면 현재 커넥션에 연결된 세션이 SQL을 실행한다.
- 세션은 트랜잭션을 시작하고 커밋 또는 롤백을 통해 트랜잭션을 종료할 수 있으며, 이후에 새로운 트랜잭션을 다시 시작할 수도 있다.
❗원자성 : 트랜잭션 내에서 실행한 작업들은 마치 하나의 작업인 것처럼 모두 성공하거나 모두 실패해야 한다. ❗트랜잭션 원자성 덕분에 여러 SQL 명령어를 마치 하나의 작업인 것처럼 처리할 수 있다. ❗자동 커밋과 수동 커밋의 차이점을 명확하게 이해해야 한다. 수동 커밋으로 전환하는 것을 트랜잭션을 시작한다고 표현한다.
📚 DB 락
- 데이터 정합성 문제를 방지하려면 세션이 트랜잭션을 시작하고 데이터를 수정하는 동안 커밋이나 롤백을 처리하기 전까지 다른 세션에서 해당 데이터를 수정할 수 없도록 막아야 한다.
- 일반적인 조회의 경우 락을 필요로 하지 않으나 일부 케이스에 대해 조회 시점에 대해 락을 필요로 하는 경우가 있다.
- 트랜잭션 종료 시점까지 해당 데이터를 다른 곳에서 변경하지 못하도록 강제로 막아야 할 때 사용한다.