2010-12-07 1 views
1

나는 영속성을 위해 myBatis를 사용하는 프로젝트를 가지고있다. 아래의 "A"메소드는 외래 키를 추가하고 myISAM에서 innoDB로 테이블을 변환 할 때까지 잘 작동했다. 변환 후에는 메소드 "A"가 자동으로 실패하고 로그의 경고조차도 실패합니다. 변환 후에는 메서드 "B"만 성공적으로 삽입됩니다. 두 방법 모두 올바른 sql을 로그에 기록하지만 "B"만 작동합니다.DB에 FK를 추가 한 후 myBatis 삽입/업데이트 기능에 커밋이 필요한 이유가 무엇입니까?

지금 커밋을해야하는 이유는 누구든지 나를 채울 수 있습니까?하지만 이전에 커밋을 할 필요가 없었습니까?

//doesnt work, but worked previously 
public void A(Role role) { 
    SqlSession session = sqlSessionFactory.openSession(); 
    try { 
     RoleMapper mapper = session.getMapper(RoleMapper.class); 
     mapper.updateByPrimaryKeySelective(role); 
    }catch(Exception e){ 
     logger.error(e); 
    } finally { 
     session.close(); 
    } 
    return; 
} 

//works correctly, but why? 
public void B(Role role) { 
    SqlSession session = sqlSessionFactory.openSession(); 
    try { 
     RoleMapper mapper = session.getMapper(RoleMapper.class); 
     mapper.updateByPrimaryKeySelective(role); 
     session.commit(); 
    }catch(Exception e){ 
     logger.error(e); 
    } finally { 
     session.close(); 
    } 
    return; 
} 

답변

10

myISAM은 트랜잭션이 아닙니다. 자동 커밋은 기본적으로 켜져 있습니다 (실제로 모든 명령문이 커밋되기 때문에 JDBC 드라이버에서 무시됩니다). innoDB는 트랜잭션이며 자동 커밋은 기본적으로 해제되어 있습니다. 즉, session.commit()을 호출해야합니다. 그렇지 않으면 DB가 실제로 업데이트를 수행하지 않습니다.

자세한 내용은 this blog entry을 참조하십시오.

자동 커밋을 수행하지 말고 커밋을 호출해야합니다. 자동 연결을 해제 한 상태로두면 연결 풀링에 문제가 발생할 수 있습니다. 연결이 다시 사용될 때 알 수없는 상태의 명령문을 남길 수 있기 때문입니다.

+0

저는 myisam과 innodb 사이의 트랜잭션 차이를 알지 못했습니다. 작은 맛있는 음식에 감사드립니다. – clarson

+0

@AngerClown 귀하의 게시물을 가져 주셔서 감사합니다. 너는 너무 도움이되었다. – hiropon