[Spring] 트랜잭션(Transaction)이란?
트랜잭션이란 데이터베이스의 상태를 변화시키기 위해 수행하는 작업단위
원자성,일관성,독립성,지속성 => 원자성을 만족시키기위해 전체를 커밋(commit)시키거나 롤백(rollback)시킨다.
여러 트랜잭션이 경쟁하면 (서로다른 사용자가 같은 내용을 수정중일때 조회하려함) => dirty read
여러 트랜잭션이 경쟁하면 (특정값을 a가 쿼리 2번날릴때 중간에 b가 커밋) => non-repeatable read 일관성 해침
여러 트랜잭션이 경쟁하면 (특정 범위 내 a가 쿼리2번날릴때 중간에 b가 커밋) => phantom read 일관성 해침
spring에서는 @Transactional으로 클래스,메서드 위에 추가 => 트랜잭션 기능이 적용된 프록시 객체 생성
Isolation (격리수준) : 트랜잭션에서 일관성이 없는 데이터를 허용하는 수준
DEFAULT
READ_UNCOMMITTED(dirty read 발생)
READ_COMMITTED(dirty read 방지)
REPEATABLE_READ(non-repeatable read 방지)
SERIALIZABLE(phantom read 방지)
Propagation (전파수준) : 기존 트랜잭션에 참여하는 방법에 대해 결정하는 속성값
REQUIRED
SUPPORTS
REQUIRES_NEW
NESTED
...
readOnly (읽기전용속성) => 단순 조회만하는 클래스에 붙여도 성능최적화에 도움이된다. @Tranactional(readOnly = true)
트랜잭션 롤백 예외 @Tranactional(norollbackFor=Exception.class) Default: RuntimeException, Error
Timeout 속성 (일정시간내에 트랜잭션 끝내지못하면 롤백) @Tranactional(timeout=10)