Transactioal
@Transactioalトランザクション、永続連絡先 データベースドライバがをサポートする場合、データベースのパフォーマンスは 向上します.トランザクションbegin、コミットを自動的に実行 .JPAのオブジェクト変更検出は、トランザクションのコミット時に を開始する. Spring@transactional宣言のメソッド実行を宣言する前にtransactional beginコードを挿入し、メソッド実行後にtransactional commitコードを挿入し、ユーザーにオブジェクト変更検出を実行するように導く. 異常が発生すると、自動的にロールバック処理 が実行される. JPAのすべてのデータ変更または論理はTransaction内で実行する必要があります Lazyロード可能 日記-@Transactional(readOnly=true)のみ データ保持 readOnly=true default- false データを変更しない日記専用の方法で、霊石城の面会客を更新しないため、性能がやや向上(読み取り専用) 汚れのない データ変更ロジック-@Transactional javax.persistence.Transaction RequiredException:エンティティマネージャがなく、現在のスレッドの実際のトランザクションが使用可能-remove呼び出しを確実に処理できない-対応するerrの具体的な値
https://mommoo.tistory.com/92
@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); //변경 감지
}
}
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
Referencehttps://mommoo.tistory.com/92
Reference
この問題について(Transactioal), 我々は、より多くの情報をここで見つけました https://velog.io/@hyunho058/Transactioalテキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol