당연한 이야기인가요..?
그런데, 손에 익지 않은 프레임웍을 사용한다면, 트랜잭션이 작동하지 않아서 DB 에 Commit 이 먹지 않을 수도 있습니다.
다른 프레임웍의 패키지를 끌어다 사용할때 트랜잭션이나 Commit 이 어떻게 동작하는지 충분히 확인해 보아야 합니다.
특히나, 프로그램에서 호출하는 프로시저에서 별도의 Commit 로직이 있다면 전체 트랜잭션과 따로 놀겠죠..
상기와 같은 이유 말고도 여러가지 이유들이 있겠습니다.. 크윽.
하나의 트랜잭션으로 묶었으면 그 안에서 동일하게 돌아가야 하는데, 꼭 한두 개는 따로 노는 넘(?)들이 있더군요.
아무튼, 트랜잭션을 설정할 때, 이 부분을 잘 살펴 보아야 합니다.
서버 단에서의 조치라면.. 다음과 같은 것이 가능하겠습니다.
이기종 DB나 다른 DB 를 끌어다 사용한다면 DB Link (오라클 외에서는 어떤 명칭으로 부르나요..?) 로 묶어 사용하거나,
요즘에 나오는 Application Server 는 이기종 DB 에서도 하나의 트랜잭션으로 묶을 수 있더군요.
아, 이것도 벌써 오래 전에 구현이 되었군요.
그렇다면 역시, 애플리케이션(Java 등등) 단에서의 조치가 필요하다는 결론이군요.
만약 A 패키지 안의 클래스 메소드(Aa)에서 B 패키지의 메소드(Bb)를 끌어다 사용해야 한다면,
다시 말해서 Aa 메소드 중 트랜잭션으로 묶이는 부분에 Bb 메소드가 사용될때..
Bb 안에서도 트랜잭션이 있다면 Bb 를 사용하면 안 되고,
Bb 와 기능은 동일하지만 트랜잭션이 걸려있지 않은 새로운 메소드를 구현하여 사용해야 합니다.
이 글을 쓰게된 이유가 바로 여기에 있네요. 설명이 장황했습니다만..
문제의 Bb 소스의 대략적인 구조가 아래와 같습니다. 트랜잭션 처리가 되어 있습니다.
public boolean addArticleInfo(ArticleInfo info) throws Exception{ Transaction tx = null; ArticleDao dao = null; boolean result = false; try{ tx = TransactionFactory.getInstance(); tx.begin(); dao = new ArticleDao();
... }catch(Exception e){ tx.rollback(); throw e; }finally{ tx.commit(); } return result; } |
문제의 Aa 메소드 입니다. 여기에서도 트랜잭션이 설정되어 있습니다.
Aa 메소드 만 놓고 보면 트랜잭션이 잘 먹혀들어갈 것같지만..
Bb 안에서 트랜잭션을 별도로 운영하기 때문에 결과적으로는 다른 트랜잭션으로 움직이고, DB 에는 반영되지 않겠죠.
따라서 Ba 에서 트랜잭션을 뺀 내용으로 별도의 메소드를 만들고, Aa 에서 이를 가져다 사용해야 합니다.
public boolean addEmailInfo(EventEmailInfo info) throws Exception{ Transaction tx = null; try{ tx = TransactionFactory.getInstance(); String c1 = info.getContent1()==null ? "" : info.getContent1(); ArticleMng articleMng = new ArticleMng(); }catch(Exception e){ |
'컴퓨터 이야기 > 프로그래밍' 카테고리의 다른 글
iframe 안에서 엔터 문자나 따옴표 들어간 변수를 parent 에 넘겨주기 (2) | 2009.04.04 |
---|---|
chr(13) 이용해서 엔터 들어간 내용을 엑셀로 저장 (2) | 2009.04.03 |
CSS 말줄임표(...) div 와 table 에 적용하기 (4) | 2009.03.26 |
오라클 DB 쿼리문에 % 나 _ 문자 등의 escape 이스케이프 처리 (1) | 2009.03.26 |
한번쯤 써 봄직한 자바스크립트 (0) | 2009.02.18 |