2010-12-08 2 views
0

저는 현재 프레임 워크로 스프링을 사용하는 응용 프로그램을 만듭니다. 그리고 난 봄을 사용하여 배치 트랜잭션을 테스트하고 싶습니다. 여기에 내 코드가있다 :spring @Transactional이 작동하지 않습니까?

public class SqlMapTestDao extends SqlMapClientDaoSupport implements TestDao { 

public List<Test> getAllTest() { 
    return getSqlMapClientTemplate().queryForList("getAllTest"); 
} 

public Test getTest(int param) { 
    return (Test)getSqlMapClientTemplate().queryForObject("getTest" , param); 
} 

public void insertTest(Test test) { 
    getSqlMapClientTemplate().insert("insertTest", test); 
} 

@Transactional(readOnly = false) 
public void insertBatch(List<Test> batch) throws SQLException{  
    for(Test test : batch) { 
     getSqlMapClientTemplate().insert("insertTest", test); 
    }    
} 
} 

그리고 나는 같은 주키를 삽입하려고한다.

@Autowired 
private TestDao testDao; 

@RequestMapping(value="/", method=RequestMethod.GET) 
public String home(@ModelAttribute Account acc) { 

    List<Test> test = new ArrayList<Test>(); 

    test.add(new Test(7, "ini empat")); 
    test.add(new Test(1, "ini satu")); 
    test.add(new Test(8, "ini lima"));  

    try { 
     testDao.insertBatch(test); 
    }catch (Exception e) { 
     logger.error("Error", e.getStackTrace()); 
    } 

    logger.info("Welcome Home"); 
    return "home"; 
} 

Id 1로 실행하면 오류가 발생하며 모든 쿼리가 롤백 될 것으로 예상됩니다. 그러나 7 명이 데이터베이스에 들어갑니다. 롤백 할 수없는 이유는 무엇입니까? 내가 어디가 잘못 됐니?

저는 데이터베이스로 ibatis와 mysql을 사용합니다.

<!-- Configures transaction management around @Transactional components --> 
<tx:annotation-driven transaction-manager="transactionManager" /> 


<!-- Resource loader for jdbc configuration --> 
<context:property-placeholder location="WEB-INF/jdbc.properties"/> 

<!-- Local Apache Commons DBCP DataSource that refers to a combined database --> 
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"> 
    <property name="driverClassName" value="${jdbc.driverClassName}"/> 
    <property name="url" value="${jdbc.url}"/> 
    <property name="username" value="${jdbc.username}"/> 
    <property name="password" value="${jdbc.password}"/> 
</bean> 

<!-- Transaction manager for a single JDBC DataSource --> 
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> 
    <property name="dataSource" ref="dataSource"/> 
</bean> 

<!-- SqlMap setup for iBATIS Database Layer --> 
<bean id="sqlMapClient" class="org.springframework.orm.ibatis.SqlMapClientFactoryBean"> 
    <property name="configLocation" value="WEB-INF/sql-map-config.xml"/> 
    <property name="dataSource" ref="dataSource"/> 
</bean> 

<!-- testing purpose --> 
<bean id="testDao" class="com.shop.cart.dao.ibatis.SqlMapTestDao"> 
    <property name="sqlMapClient" ref="sqlMapClient"/> 
</bean> 
+0

@Transactional 어노테이션이있는 클래스가 Spring에 연결되어 있습니까? Spring은 프록시를 설정할 수 있도록 배선 작업을 수행해야합니다. – Pace

+0

예. 할 수 있습니다. <속성 이름 = "sqlMapClient"ref = "sqlMapClient"/>. 내 거래 롤백을위한 오른쪽 차선에 있습니까? –

+0

당신은 Spring에서 testDao 빈을 설정했지만 Spring에서 테스트에서 testDao 인스턴스를 얻나요? 전체 시험 수업을 게시 할 수 있습니까? – gdj

답변

5

이 MySQL의 테이블이 InnoDB의 유형이 아니기 때문에 트랜잭션이 작동하지 않을 수 있음 : 여기

및 XML 구성입니다.

+0

아니요, MyISAM을 사용합니다. –

+2

+1 - MyISAM은 트랜잭션을 지원하지 않습니다. http://dev.mysql.com/doc/refman/5.1/en/myisam-storage-engine.html –

+0

감사합니다. –

1

Spring XML 구성에 필요한 모든 요소가 정의되어 있습니까?

<tx:annotation-driven transaction-manager="txManager"/> 

<bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> 
    <!-- (this dependency is defined somewhere else) --> 
    <property name="dataSource" ref="dataSource"/> 
</bean> 

어느 쪽이든, 여기에 스프링 XML 구성을 추가 진단 도움말을 위해 게시해야합니다. 자세한 내용은 Transaction Management을 참조하십시오.

+0

이미 구성되었습니다. 위의 내 게시물에서 다시 확인하십시오. 감사. –