-
EJB에서 DB Transaction 처리 중 "java.sql.SQLException: Cannot call Connection.commit in distributed transaction. Transaction Manager will commit the resource manager when the distributed transaction is committed." 발생 시 대처초급 개발자 이야기/노하우 쌓아가기 2009. 7. 13. 14:10
이 카테고리에는 더 이상 글이 올라오지 않습니다.
별도의 개발 블로그를 열어 개발에 관련된 이야기는 블로그를 분리하였습니다.
만약 더 많은 개발 이야기가 보고 싶으시다면 아래 링크로 이동해 주세요.
link : Digital Blue Eye's dev-ops
#######################################################################################################
EJB에서 Transaction을 처리하다 보면 아래와 같은 Exception이 발생하는 경우가 있습니다.
java.sql.SQLException: Cannot call Connection.commit in distributed transaction. Transaction Manager will commit the resource manager when the distributed transaction is committed.
저도 아직 명확히 어느 부분의 셋팅이 문제가 된 것인지 찾아내지는 못했습니다.
2년전 프로젝트 진행할 때에는 해당 Exception이 떨어지지 않았는데 올해 유지보수에 들어가기 위해 개발환경을 다시 맞추다 보니 발생하더군요.
우선 원인은 transaction이 두번 발생하기 때문입니다.
EJB Containner는 자체적으로 Transaction Controller(이하 EJB TC)를 가지고 있습니다. 대부분 EJB를 사용하실 때는 이 EJB TC를 의지하게 되는데요. 저희처럼 이 EJB TC를 신뢰하지 못하고 프로그램에서 Transaction 처리를 할 경우 문제가 발생합니다.
EJB TC에 의해 Transaction이 처리된 상태에서 프로그램에서 commit()을 호출하거나 AutoCommit 설정을 true로 설정할 경우 두번의 Transaction이 발생하게 되는 것이죠.
이 문제의 해결방법은 EJB Build Configure인 ejb-jar.xml을 수정하는 것입니다.
ejb-jar.xml의 아래 부분을 찾아가 붉은 글씨 부분을 "NotSupported"로 수정해 주시면 됩니다. 대부분 "Required" 설정을 사용하실 겁니다.
<assembly-descriptor> <container-transaction> <method> <ejb-name>SrmSegmentationEJB</ejb-name> <method-intf>Remote</method-intf> <method-name>*</method-name> </method> <trans-attribute>NotSupported</trans-attribute> </container-transaction> </assembly-descriptor>
사실 EJB TC를 사용하지 않으면 EJB를 사용하는 의미가 없다는 이야기까지 나오고는 합니다.
현재의 수많은 발전된 Framework들의 Transaction Control은 매우 성능이 좋습니다.
하지만 수년전 EJB의 그것은 그렇지 않은 모양이더군요.
어쨋든 저 Exception에 대해서는 설명과 같이 대처하시면 되겠습니다...^^'초급 개발자 이야기 > 노하우 쌓아가기' 카테고리의 다른 글
OSX에서 Java 개발하기 - Java Compiler를 실행하다 (0) 2010.11.29 ie 업데이트 후 애플릿이 실행되지 않을 때 해결 방법 (0) 2009.07.17 Spring Framework에서 외부 property 사용하기 (0) 2009.06.08 비스타에서 "신뢰할 수 있는 루트 기관" 인증서 설치하기 (2) 2009.01.13 이클립스에서 등록된 CVS 설정 변경하기 (0) 2009.01.05