2014-06-21 3 views
0

나는 봄 4.0.5, MySQL은 5.6.19 및 BoneCP을 사용하고 각 인서트 해제 자동 커밋 0.8.0MySQL의 : 봄

내 문제는 응용 프로그램에 정의 된 하나의 트랜잭션 내에서, MySQL이 커밋되어 있다는 점이다

각 삽입 또는 업데이트, 그래서 그것은 거래를하지 않습니다.

모든

우선, 난 내 같은 몇 가지 질문을 읽고,하지만 봄의 데이터 소스에서이 설정은 나를 위해 작동하지 않습니다

DBWriter.java :

<property name="defaultAutoCommit" value="false" /> 

내 수업이 있습니다

private DataSourceTransactionManager txManager; // Injected in Spring Beans XML 
private IMyDAO writerDAO; 

public void saveBeans(DataContainer targetData) throws Throwable{ 
    try { 
     JdbcTemplate templateTransaction = new JdbcTemplate(txManager.getDataSource()); 

     MyTx newTx = new MyTx(targetData, templateTransaction, writerDAO); 

     TransactionTemplate txTemplate = new TransactionTemplate(txManager); 
     txTemplate.execute(newTx); 
    } catch (Throwable e) { 
     logger.error("Error saving into DB", e); 
     throw e; 
    } 
} 

MyTx.java

public class MyTx extends TransactionCallbackWithoutResult { 
private IMyDAO writerDAO; 
private DataContainer finalData; 
private JdbcTemplate txTemplate; 

public MyTx(DataContainer newData, JdbcTemplate newTxTemplate, IMyDAO writerDAO){ 
    this.finalData = newData; 
    this.txTemplate = newTxTemplate; 
    this.writerDAO = writerDAO; 
} 

@Override 
protected void doInTransactionWithoutResult(TransactionStatus status) { 
    writerDAO.saveTargetBean(newData, txTemplate); 
} 

}

MyDAO.java 단계 또는 강제 장애에 의해 단계, 먼저, 둘째, Thirs을 디버깅 할 때

private void saveTargetBean(...) { 
    jdbcTemplate.update("INSERT...", ...); // First 
    jdbcTemplate.update("INSERT...", ...); // Second 
    jdbcTemplate.update("INSERT...", ...); // Third 
} 

내 문제는 즉시 투입된다 트랜잭션 동작없이 데이터베이스에 저장됩니다.

내 코드 또는 접근 방식에 문제가 있습니까? INSERT 문장을 직접 doInTransactionWithoutResult 메서드에 넣어야합니까? 다른 방법으로이 작업을 수행해야합니까? 3 가지 삽입 작업은 트랜잭션 방식으로 수행 되었습니까?

도움이 될 매우 감사하겠습니다. 감사합니다.

+1

당신은 MySQL은 당신이 트랜잭션을 지원 테이블을 사용하고 있는지 확인 사용하고 있습니다. MyISAM 테이블은 트랜잭션을 지원하지 않으므로 InnoDB 테이블인지 확인하십시오. 선언적 트랜잭션을 사용하지 않고 수동 트랜잭션을 사용하는 이유는 무엇입니까? 또한'JdbcTemplate'과'TransactionTemplate'은 스레드로부터 안전합니다. 컨텍스트에서 생성하고 주입하고 다시 사용하십시오. 특히'JdbcTemplate'은 상당히 크고 시간이 많이 소요되는 객체 생성입니다. –

+0

@ m-deinum, 답변 해 주셔서 감사합니다. 선언적 트랜잭션을 시도해 보겠습니다. 나는 InnoDB 테이블 (검증 됨)을 사용하고있다. –

답변

0

Martin이 제안한 것처럼 @Transactional을 사용한 선언적 트랜잭션이 더 좋으며 저에게 좋습니다. 그래서,이 두 링크가이 주제에 나에게 매우 도움이되었다 당신에게

감사합니다 :

Propagation types

@Transactional example