본문 바로가기

지루한 일상

[Oracle/Weblogic] transaction manager will commit the resource manager when the distributed transaction is committed 에러 해결법

336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

이 블로그에는 되도록이면 개발의 ㄱ자도 안꺼내고 지내려고 했는데 개발얘기 쓰던 곳이 날아가서 여기에 쓰기로 했다.

회사에서 사용하는 내 IDE(이클립스 사용) 환경은 정말 돌았다고 할 수 있는데

멀쩡한 config 파일이 하루에도 수시로 날아가고 웹로직이 갑자기 훼까닥 돌고 엄청 구닥다리 version의 SW들을 사용하는 그런..  뭐 로컬에서 사용하는 WAS서버가 웹로직인 것부터가 잘못일수도..

아무튼 최근에 나를 아주 미치게 한 에러가 있는데, java단에서 commit을 날리려고 하면 아래와 같은 에러가 발생한다.

java.sql.SQLException: Cannot call Connection.commit in distributed transaction.
Transaction Manager will commit the resource manager when the distributed transaction is committed
java.sql.SQLException: Cannot call Connection.commit in distributed transaction.
Transaction Manager will commit the resource manager when the distributed transaction is committed

1차 원인을 알아내었는데.. 뭐 원인이랄 것도 없이 저 문구 그대로 해석하면 된다. (간만에 보는 직관적인 에러 메시지인듯)

Transaction Manager가 알아서 commit을 할건데 왜 니가 소스단에서 commit을 날려버리냐...라는..

분산 트랜잭션(distributed transaction)은 '모(commit) 아니면 도(rollback)' 방식을 고수하는 예민하신 분이라 개발자의 임의 커밋을 용납할 수 없으니 커밋과 롤백은 무조건 자기쪽에서 도맡겠다다는 고집이 있으시다. 자 그럼 어쩌나.. 분산 트랜잭션(XA)를 쓰지 않으면 된다. (안써도 되는 환경이라는 가정 하에)

해결방법은 우선 weblogic console을 연 다음, context-transaction.xml에서 사용하는 데이터소스들에 대해서 트랜잭션이 XA(전역)인지 NonXA(로컬)인지 확인하고 XA를 쓰는 것이라면 NonXA로 바꾸고..  NonXA 데이터소스 설정 메뉴에서 '전역 트랜잭션 지원' 체크박스를 해제하고 웹로직 Restart하면 되더라긔. DB 확인 결과 정상 commit되어 Success로 떨어진거 확인 했을 때의 그 큰 기쁨..

그 와중에도 전 웹로직이 또 맛이 가서 컴터 재부팅 하러..

솔직히 내가 겪는 웹로직 오류 대부분은 껐다 키거나, 웹로직 서버 재시작하거나, 웹로직 서버 clean 때리거나, 프로젝트 clean하면 해결된다. deploy에 필요한 파일들이 과정 중 for some reasons로 날아가는 경우가 대부분이라..