Transactioal


@Transactioal
  • トランザクション、永続連絡先
  • データベースドライバが
  • をサポートする場合、データベースのパフォーマンスは
  • 向上します.
  • トランザクションbegin、コミットを自動的に実行
  • .JPAのオブジェクト変更検出は、トランザクションのコミット時に
  • を開始する.
  • Spring@transactional宣言のメソッド実行を宣言する前にtransactional beginコードを挿入し、メソッド実行後にtransactional commitコードを挿入し、ユーザーにオブジェクト変更検出を実行するように導く.
  • 異常が発生すると、自動的にロールバック処理
  • が実行される.
  • JPAのすべてのデータ変更または論理はTransaction内で実行する必要があります
  • Lazyロード可能
  • 日記-@Transactional(readOnly=true)のみ
  • データ保持
  • readOnly=true
  • default- false
  • データを変更しない日記専用の方法で、霊石城の面会客を更新しないため、性能がやや向上(読み取り専用)
  • 汚れのない
  • データ変更ロジック-@Transactional
  • @Service
    @Transactional(readOnly = true) //일기 전용에서는 readOnly = true 를 해주면 트렌젝션이 최적화 해서 조회를 한다(성능 향상)
    @RequiredArgsConstructor //final 이 있는 필드를 가지고 생성자를 만들어줌
    public class MemberService {
        
        private final MemberRepository memberRepository;
    
        /**
         * 회원 가입
         *
         * @param member
         * @return
         */
        @Transactional // default => readOnly = false 일기/쓰기 에서 true 를 하면 쓰기가 안된다.
        public Long join(Member member) {
            validateDuplicateMember(member); //중복 회원 검증 memberRepository.save(member);
            memberRepository.save(member);
            return member.getId();
        }
    
        private void validateDuplicateMember(Member member) {
            List<Member> findMembers = memberRepository.findByName(member.getName()); //member.getName() 를 유니크 제약조건을 달아야 한다 (방어코드)
            if (!findMembers.isEmpty()){
                throw new IllegalStateException("이미 존재하는 회원이빈다.");
            }
            //조회된 맴버 수 가 0보다 크면 중복 아이디가 있음을 확인하는 로직이 더 최적화된 로직이다.
            //TODO : 조회된 맴버 수가 0 이상이면 예외 발생
    
    
            //해당 메서드는 두명의 유저가 동시에 "A" 라는 아이디로 회워가입을 하게되면 문제가 발생한다(A라는 회원이 두명이 된다)
        }
    
        /**
         * 회원 전체 조회
         */
        public List<Member> findMembers(){
            return memberRepository.findAll();
        }
    
        public Member findOne(Long memberId){
            return memberRepository.findOne(memberId);
        }
    
        @Transactional  //Transaction 이 끝날때 commit 발생
        public void update(Long id, String name) {
            Member member = memberRepository.findOne(id);   //영속상태
            member.setName(name);   //변경 감지
        }
    }
  • javax.persistence.Transaction RequiredException:エンティティマネージャがなく、現在のスレッドの実際のトランザクションが使用可能-remove呼び出しを確実に処理できない-対応するerrの具体的な値
  • 2021-05-27 08:52:45.081 ERROR 3135 --- [nio-9112-exec-8] o.a.c.c.C.[.[.[/].[dispatcherServlet]    : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is org.springframework.dao.InvalidDataAccessApiUsageException: No EntityManager with actual transaction available for current thread - cannot reliably process 'remove' call; nested exception is javax.persistence.TransactionRequiredException: No EntityManager with actual transaction available for current thread - cannot reliably process 'remove' call] with root cause
    javax.persistence.TransactionRequiredException: No EntityManager with actual transaction available for current thread - cannot reliably process 'remove' call
    Reference
    https://mommoo.tistory.com/92