minlog
article thumbnail
Published 2023. 3. 30. 02:19
[ JPA ] Transaction BackEnd/Security · JPA

Transaction

Transaction 이란 DB 명령어들의 논리적인 묶음이다.

Transaction 이라는 단어를 사용해서 여러가지의 쿼리들을 묶어서 사용하고 있다.

ex) 하나의 Transaction  :  물건 구매  =>  결제 + 주문 

 

1 . ACID 특성

  • A - 원자성 : 부분적인 성공을 허용하지 않는다.
  • C - 일관성 : 데이터간의 정확성을 맞춘다.
  • I - 독립성 : Transaction 내의 데이터 조작은 다른 Transaction 으로 부터 독립적인 속성을 가진다.
  • D - 영구적 보관 : 데이터는 영구적으로 보관이 된다.

 

 

2. 사용방법

- @Transaction 어노테이션 을 사용할 수 있다.

 

1) DB저장 시점

save 가 되어도 DB에 저장이 되지 않는다.  

putBookAndAuthor 메서드 안의 내용이 모두 성공적으로 완료되었을 시, 데이터에 저장 된다.

@Transactional
public void putBookAndAuthor(){
	Book book = new Book();
    book.setName("jap start");
    bookRepository.save(book);
    
    Author author= new Author();
    author.setName("j");
    authorRepository.save(author);
}

 

 

2) @Transaction 어노테이션 속성

isolation = Isolation.격리수준
READ_UNCOMMITTED  아직 커밋되지 않은 데이터도 읽어온다. 
@DynamicUpdate로 객체에 어노테이션해주면 필요한 정보만 업데이트 시켜준다. dirty read라는 문제 점이 있어 데이터의 정확성을 해치게되는 경우가 많아 실제 서비스에서는 잘 사용하지 않는다.
READ_COMMITTED  커밋 된 데이터를 읽어온다. ( 더티 리드 현상이 사라진다. )
EX) 사용자 A와 B가 있을시, A가 컬럼 데이터를 변경하는 중 (커밋을 하지 않은 상) Transaction B가 READ하면 A가 변경하기 전 데이터를 읽어온다. 만약 A가 커밋을 완료하게되면 B는 변경된 데이터를 읽을 수 있다.
REPEATABLE_READ 반복 가능한 읽기가 가능하다.
항상 일관성 있는 데이터 읽기를 보장하는 레벨 이다. 다른 트랜잭션에서 데이터를 조작하여도 영향을 받지 않는다.
SERIALIZABLE 직렬화 가능, 가장 높은 격리 수준이다.
커밋이 일어나지 않은 Transaction이 존재하게되면 롹을 걸어서 웨이딩이 존재하게 된다. 커밋이 실행되어야만 추가적인 로직이 진행된다. 하지만 성능에 좋지 못하다 때문에 잘 사용하지 않는다.

 

propagation = Propagation.전파  (Transaction 의 교통정리를해준다.)
REQUIRED 만약 기존 Transaction이 있다면 그대로 사용하고, 없다면 새로운  Transaction을 생성해서 사용한다. 아무런 설정을 하지 않았을 경우 defult 값으로 들어간다.
REQUIRES_NEW 서로 완전히 독립적인 Transaction을 사용한다.
호출하는 쪽의 커밋 롤백과 상관없이 자체적으로 커밋과 롤백을 진행한다.
NESTED 부모 트랜잭션이 존재하면 부모 트랜잭션에 중첩시키고, 부모 트랜잭션이 존재하지 않는다면 새로운 트랜잭션을 생성한다.
부모 트랜잭션에 예외가 발생하면 자식 트랜잭션도 rollback한다. 자식 트랜잭션에 예외가 발생하더라도 부모 트랜잭션은 rollback하지 않는다. 이때 롤백은 부모 트랜잭션에서 자식 트랜잭션을 호출하는 지점까지만 롤백된다.
SUPPORTS 만약 기존 Transaction이 있다면 그대로 사용하고, 없다면 Transaction 없이 사용이 된다.
NOT_SUPPORTED Transaction이 없이 실행되게 된다.
MANDATORY 필수적으로 Transaction 이 존재해야한다. 없으면 오류를 발생시킨다.
NEVER Transaction이 없어야한다. 있다면 오류를 발생시킨다.

 

 

 

 

3. 잘못된 어노테이션의 사용

1 ) 'RuntimeExcption' 은 롤백이 되고 , 'Excption'은 롤백이 되지 않는다.

- Excption도 롤백이 가능하게 하는 방법 

@Transaction (rollbackFor = Exception.class)

 

2 ) 같은 클래스 내에서 호출되는 메서드에서 @Transaction 어노테이션 사용

put에서 메서드를 불러올시 어노테이션을 읽지 않고 실행시킨다.

public void put(){
	this.putBookAndAuthor();
}

@Transactional
public void putBookAndAuthor(){
	Book book = new Book();
    book.setName("jap start");
    bookRepository.save(book);
    
    Author author= new Author();
    author.setName("j");
    authorRepository.save(author);
}
profile

minlog

@jimin-log

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!