1. 특징

    1. 데이터베이스에서 데이터를 처리하는 하나의 논리적인 작업 단위
    2. 트랜잭션에는 여러 개의 쿼리를 포함할 수 있고 하나라도 실패할 경우 전체 트랜잭션이 롤백되어서 데이터의 일관성을 보장한다.
  2. 트랜젝션 동작 순서

    1. 트랜잭션이 붙은 메소드가 호출되면, Spring 은 트랜잭션을 시작한다.
    2. 메소드 내에서 데이터베이스에 대한 쿼리를 수행하면, 이 쿼리는 모두 해당 트랜잭션 안에서 실행된다. 주의할점은 쿼리의 결과는 바로 데이터베이스에 반영되지는 않고, 트랜잭션 내에서만 이뤄진다.
    3. 메소드가 종료되면 Sping은 트랜잭션을 커밋하려고 시도한다. 이 때 트랜잭션 내 실행된 모든 쿼리가 성공적으로 수행되었는지 확인하게 된다. 이때 외래키 제약조건 확인 등의 데이터베이스 무결성 검사도 이뤄진다.
    4. 모든 쿼리가 성공적으로 수행되었다면, 트랜잭션은 커밋되어 데이터베이스에 반영된다.하나의 쿼리라도 실패하거나, 데이터베이스 무결성 검사에서 문제가 발견되면 트랜잭션은 롤백되고, 트랜잭션 내에서 수행된 모든 쿼리의 결과는 데이터베이스에 반영되지 않는다.
  3. 예시

    @Transactional
    public void createProduct(ProductDTO dto){
    	Optional <Product> product = productRepository.findById(dto.getId());
    	Optional <User> user = userRepository.findById(dto.getId());
    	//이 두 과정이 다 true 이면 그대로 되고 하나라도 false면 이 과정들 롤백
    	
    }