본문 바로가기

개발/JAVA

sqlMapClient 인터페이스 transaction 메소드

출처: http://egloos.zum.com/slog2/v/3572025



1. iBatis 트랜잭션 처리


sqlMapClient 인터페이스는 트랜잭션 경계를 지정하기 위한 메소드를 가집니다

다음과 같은 메소드를 사용해 커밋/롤백 됩니다


public void startTransaction() throws SQLException

public void commitTransaction() throws SQLException

public void endTransaction() throws SQLException


예제)

public void reply(ReVO vo) throws SQLException {

// start 한뒤 commit 이 일어나지 않은 상태에서 end 가 되면 자동으로 롤백

try {

sqlMapper.startTransaction();

sqlMapper.update("re.addStep",vo);

sqlMapper.insert("re.reply",vo);

sqlMapper.commitTransaction();

} finally {

sqlMapper.endTransaction();

}

}



소스를 보면 startTransaction 으로 트랜잭션의 시작을 알리고

작업 수행중에 

익셉션이 발생하게 되면 바로 finally에서 transaction을 끝내고

그렇지 않으면 마지막에 commit 을 수행하고 finally에서 transaction을 끝냅니다..참 간단 하네요 ㅎ

( 롤백은 commitTransaction을 수행하지 않고 endTransaction을 수행하면 자동으로 수행됩니다 ~ )


finally 구문은 익셉션이 발생하든 안하든 무조건 try문이 끝나고 수행되는거 알고 계시죠? ^^ 


주의! 

startTransaction()을 호출하는 쓰레드가 트랜잭션처리를 위해 유일한 Connection 객체를 갖게 됩니다

그러니 반드시 endTransaction()을 호출해서 Connection 객체를 반환해야합니다

그렇지 않으면 중대한 영향을 미치게됩니다 ( 심하면 다운될수도... )



2. 외부/프로그래밍적 트랜잭션


Spring 또는 EJB 등의 프레임워크를 이용해 전역 트랜잭션을 관리 할 수 있습니다

그럴 경우엔 SQL Map 트랜잭션 제어 메소드는 사용할 필요가 없어지게됩니다..


외부적 또는 프로그래밍적 전역 트랜잭션을 지원하기 위해서는 SQLMap 설정파일에서

<transactionManager> type 속성을 "EXTERNAL"으로 설정해야 합니다




출처: http://blog.daum.net/marique/21



queryForObject

DB로부터 1개의 레코드를 가져와 자바 객체에 저장한다. 

오직 한 개의 레코드만 반환되는 여부를 검사하는 메소드 이므로, 하나 이상의 레코드가 반환되는 경우 예외처리 됨.


그리고 값이 없을 경우는 null을 반환.



queryForList

DB로부터 1개 이상의 레코드를 가져와 자바 객체의 List를 만드는데 사용한다.

반응형