2009-04-25 4 views
0
final DataSource ds = DataSourceLocator.getInstance() 
    .getDataSource(sg.cmpl.starhub.lprs.Constants.APP_KEY); 
final DataSourceTransactionManager txManager = new DataSourceTransactionManager(); 
txManager.setDataSource(ds); 

final DefaultTransactionDefinition def = new DefaultTransactionDefinition(); 
def.setIsolationLevel(TransactionDefinition.ISOLATION_READ_COMMITTED); 
final TransactionStatus status = txManager.getTransaction(def); 

Connection conn = null; 
PreparedStatement ps = null; 

try { 

    /***************************************************************************/ 
    conn = DataSourceUtils.getConnection(ds); 
    ps = conn.prepareStatement(sql); 
    ps.execute(); 
    /***************************************************************************/ 

    txManager.commit(status); 

} catch (Exception e) { 
    txManager.rollback(status); 
} 

트랜잭션 관리자 논리에 문제가 있습니까? 그것은 불안정한 것처럼 보입니다. 새 데이터를 삽입하면 처음에는 저장 한 것처럼 보이고 나중에는 mysql 데이터베이스에서 데이터를 찾을 수 없습니다. 도와주세요. 고마워.Spring DatasourceTransaction Manager 문제

답변

0

예, 문제가 있습니다. 이것은 봄이 아닙니다. 이런 경우 코드에 commit/rollback 논리를 두어서는 안됩니다. 이점은 구성에서 선언적으로 할 수있는 경우에옵니다.

Spring transaction reference docs을 살펴보십시오.

1

프로그래밍 방식의 연결 및 트랜잭션 관리를 원한다는 특별한 이유가 있다고 가정 할 때 나는 스프링의 JdbcTemplate을 살펴보고 TransactionTemplate에 그 사용법을 포장하는 것이 좋습니다. 이전 코멘트에 명시된 바와 같이

그러나, 당신은 가능한 한 많은 프로그램 트랜잭션 관리를 방지하고 주석 (@Transactional) 또는 XML 구성을 (TransactionProxyFactoryBean 또는 <tx:advice/>) 대신에 사용하려고합니다.

0

사이드 노트 : Spring 문서에 따르면 커밋 작업이 TransactionException으로 실패하면 롤백이 이미 호출되었으며 catch 블록에서 다시 호출하면 IllegalTransactionStateException이 트리거됩니다.