DB에서 수행하는 작업 단위
MySQL에서는 기본적으로 sql한 줄이 하나의 작업 단위로 설정되어 있음.
기본적으로 오토커밋이 켜져있음(mysql,mariadb둘다)
원래는 아래와 같이 원하는 만큼의 DB작업 단위(트랜잭션)를 명시적으로 묶어서 지정해줘야 함
START TRACSACTION;
SELECT * FROM product;
COMMIT;
AUTOCOMMIT On,Off
Set AUTOCOMMIT = false;
Set AUTOCOMMIT = true;
JPA에서는 기본적으로 AUTOCOMMIT이 꺼져있다.
commit이 완료되어야 정상적으로 트랜잭션이 마무리 된다. commit전 까진 복구나 철회가 가능하지만 commit 이후는 불가능하다.
원자성
트랜잭션 내의 모든 내용이 적용되거나, 하나라도 안되면 모든 내용이 적용되지 않아야 한다.
(하나의 트랜잭션은 하나의 덩어리라고 생각하면 된다)
일관성
작업 처리 결과가 항상 일관성이 있어야 한다.
(제약조건과 관련있음)음수가 되면 안되는 값에 제약조건을 걸어서 같은 작업을 계속 수행하다가 제약조건을 위배하면 실행이 실패하도록 하여 결과의 일관성을 확보해야함)
독립성
어떤 트랜잭션이라도 다른 트랜잭션 연산 중간에 끼어들 수 없다.
영구성
트랜잭션이 완료되면 영구적으로 반영되어야 한다.
(하드웨어랑 관련있음)
@transactional
해당 어노테이션이 붙은 대상이 호출하는 DB작업을 하나의 트랜잭션으로 묶어서 작업을 수행시킨다. 메소드에 붙어있다면, 해당 메소드가 return될 때 flush 후 commit 처리된다.
이 때 원자성에 의해 여러개의 DB호출이 모두 성공해야 해당 메소드의 DB처리가 정상적으로 완료된다.
readOnly = true 옵션으로 읽기 작업만 있을 때 성능을 높일 수 있다.
EntityManager
hibernate가 구현해둔 구현체(Entity관리)
hibernate는 여기 담아둔 객체나 데이터를 통해 CRUD등 DB작업을 수행한다.EntityManager는 EntityManegerFactory를 통해 클라이언트의 요청을 받아 하나씩 생성되며 각 EntityManager는 내부에 영속성 컨텍스트를 가지고 있다.
또한 DB작업시 HikariCP가 만들어둔 Connection을 임대받는 대상이다.
flush
쓰기 지연 쿼리에 담긴 쿼리를 실행하는 역할을 수행하며 스냅샷과 엔티티의 변경을 감지하고 update문을 만들어두기도 한다.
Transaction Commit
트랜잭션을 마무리하는 단계로, 커밋 시점에 flush()메소드를 호출하여 변경감지, 쌓인 쿼리 실행, commit을 통한 실제 결과 반영 등의 기능을 수행한다.