해결된 질문
작성
·
458
0
commit은 해당 정보를 스냅샷해서 저장한다는 개념이잖아요?
즉 변화가 일어났든지 일어나지 않든지 1시에 커밋했다가 2시에 컷밋할 수도 있잖아요? 별로 의미가 없을지는 모르겠지만 논리적으로 오류는 없으니까 가능하지 않을까 생각했습니다.
그래서 test할 때 tx.commit()을 try catch 문의 finally에 넣어보았습니다. 변화가 있든지 없든지 롤백되든지 commit() 해라는 의미로요.
tx.begin();
try{
로직
} catch(Exception e){
tx.rollback();
}
finally{
tx.commit();
em.close();
}
일단 로직은 tx.commit()을 catch 안에 뒀을 시 예외가 발생하는 로직입니다.
아무튼 tx.commit을 finally 안에 넣고 실행하면 Transaction not successfully started 라는 애러가 뜨게 됩니다.
질문을 정리하자면
1. 변화가 없는 상테에서 commit이 가능한가요?
2. 왜 finally 안에 tx.commit()이 있으면 Transaction not successfully started 오류가 발생할까요?
답변 1
1
안녕하세요. 컴퓨터공부하자님
생각하신 것 처럼 commit은 정상적일 때도 할 수 있고, 예외가 발생해도 commit을 할 수 있습니다.
지금 이 오류가 뜨는 것은 뭔가 로직에 다른 문제가 있는 것 같습니다.
추가로 도움이 필요하시면 전체 프로젝트를 압축해서 구글 드라이브로 공유해서 링크를 남겨주세요.
추가로 다음 내용도 코멘트 부탁드립니다.
1. 실행 방법을 알려주세요.
2. 어떻게 문제를 확인할 수 있는지 자세한 설명을 남겨주세요.
감사합니다.
답변 감사합니다! 오류는 해결하였습니다. 로직상에 사용된 entity manager가 transaction을 생성한 entity manager와 다른 entity manager였고 이미 close()된 상태였습니다. 결론적으론 오타때문에 발생한 문제였습니다. 영한님께서 말씀하신 것처럼 로직상의 문제가 맞네요! 다만 오류 로그가 어째서 "null pointer exception"이나 "사용할 수 없는 entity manager 입니다." 라고 뜨지 않았는지는 조금 의문이네요. em.close() 되면 em은 null이 되는 것이 아닌가봐요.