-
[Java] 트랜잭션프로그래밍/Java 2021. 11. 13. 00:13반응형
이 글은 혼자 학습한 내용을 바탕으로 작성되었습니다.
틀리거나 잘못된 정보가 있을 수 있습니다.
댓글로 알려주시면 수정하도록 하겠습니다.
1. 트랜잭션이란
- 트랜잭션이란 하나의 큰 작업을 수행하기 위해 작은 여러 작업들을 하나의 그룹으로 묶어 처리하는 것을 말합니다.
쉽게 말해 특정 작업을 수행하는 작업 단위를 말합니다. - 작은 여러 작업들을 하나의 그룹으로 묶어 처리하는 것을 트랜잭션이라고 하였습니다. 그래서 트랜잭션은 작은 작업들이 모두 성공하거나 하나의 작은 작업이 실패하면 모두 실패하여야 합니다.
- 수행한 많은 작업들이 모두 성공하면 작업 결과를 저장합니다. 이를 커밋(Commit)이라고 합니다.
- 수행한 많은 작업들 중 하나가 실패하게 된다면 이전에 성공은 모두 무시하고 작업의 수행 전으로 상태를 모두 되돌려 놓습니다. 이를 롤백(Rollback)이라고 합니다.
2. 트랜잭션 특성
- 트랜잭션은 ACID라는 원자성, 일관성, 격리성, 지속성을 보장해야 합니다.
- 원자성 : 트랜잭션 안에서 실행하는 여러 작업들은 하나인 것처럼 모두 성공하거나 모두 실패해야 합니다.
- 일관성 : 모든 트랜잭션은 일관성 있는 데이터베이스 상태를 유지해야 합니다.
예) 데이터베이스에서 정한 무결성 제약조건을 항상 만족해야 합니다. - 격리성 : 동시에 실행되는 트랜잭션들이 서로에게 영향을 미치지 못하도록 서로 격리해야 합니다.
예) 동시에 같은 데이터를 수정하지 못하게 해야 합니다. - 지속성 : 트랜잭션이 성공적으로 완료되면 항상 그 결과는 저장되어야 합니다.
중간에 문제가 생기더라도 데이터베이스 로그 등 다른 방법을 이용하여 성공한 트랜잭션 내용을 복구해야 합니다.
3. 트랜잭션 격리 수준
- 트랜잭션은 원자성, 일관성, 지속성을 보장합니다. 하지만 격리성은 상황에 따라 보장이 될 수도 아닐 수도 있습니다. 완벽한 격리성을 보장하기 위해서는 여러 트랜잭션이 요청되면 요청된 순서대로 진행이 되어야 합니다. 그러나 이 경우 동시처리에 대한 성능이 낮아지게 됩니다. 그래서 트랜잭션에는 4가지의 격리 수준이 존재합니다.
- 격리 수준은 낮을수록 동시성이 좋아지나 많은 문제가 발생합니다.
격리 수준 Dirty Read Non-Repeatable Read Phantom Read Read uncommitted O O O Read committed X O O Repeatable Read X X O Serializable X X X - Read uncommitted : 커밋하지 않은 데이터를 읽을 수 있습니다.
예) 트랜잭션 1이 A라는 데이터를 수정 중에 트랜잭션 2는 수정 중인 A데이터를 조회할 수 있습니다. 이것을 Dirty Read라고 합니다. 만약 트랜잭션 2가 Dirty Read 한 데이터를 사용 중에 트랜잭션 1이 작업 중 문제가 생겨 롤백을 하게 되면 데이터의 정합성에 문제가 발생하게 됩니다. - Read committed : 커밋한 데이터만 읽을 수 있습니다. 그러므로 Dirty Read는 발생하지 않지만 Non-Repeatable Read는 발생할 수 있습니다.
예) 트랜잭션 1이 A라는 데이터를 조회한 뒤 트랜잭션 2가 A데이터를 변경 후 커밋을 하고 트랜잭션 1이 A라는 데이터를 다시 조회한다면 처음 조회한 데이터 A와 두 번째 조회한 데이터 A는 달라지게 됩니다. 이렇듯 반복하여 조회가 불가능한 상태를 Non-Repeatable Read라고 합니다. - Repeatable Read : 한번 조회한 데이터를 반복해서 조회하여도 같은 데이터가 조회되는 것을 보장합니다. 그러나 Phantom Read는 발생할 수 있습니다.
예) 트랜잭션 1이 1000원 미만의 상품을 조회하고 난 뒤 트랜잭션 2가 500원의 상품을 등록하고 커밋 후 다시 트랜잭션 1이 1000원 미만의 상품을 조회하는 경우 처음 조회한 결과 집합과 두 번째 조회한 결과 집합이 서로 달라지게 됩니다. 이렇듯 반복 조회하여 결과 집합이 달라지는 것을 Phantom Read라고 합니다. - Serializable : 가장 엄격한 격리 수준으로 아무런 문제가 발생하지 않지만 동시성이 가장 낮은 격리 수준입니다.
트랜잭션의 격리 수준은 높으면 높을수록 문제 발생이 적어지지만 동시성이 낮아지므로 무조건 적으로 높은 격리 수준을 적용할 수 없습니다. 그래서 보통은 Read Committed를 기본 격리 수준으로 많은 데이터베이스들이 선택을 하고 있으며 만약 더 높은 수준의 격리가 필요한 경우 트랜잭션의 락(Lock) 기능을 이용합니다.
반응형'프로그래밍 > Java' 카테고리의 다른 글
[Java] toString 메소드 재정의 (0) 2022.03.03 [Java] Reflection Private (0) 2022.01.11 [Java] Reflection Invoke (0) 2021.12.31 [Java] Reflection(리플렉션) (0) 2021.12.29 - 트랜잭션이란 하나의 큰 작업을 수행하기 위해 작은 여러 작업들을 하나의 그룹으로 묶어 처리하는 것을 말합니다.