저는 현재 프레임 워크로 스프링을 사용하는 응용 프로그램을 만듭니다. 그리고 난 봄을 사용하여 배치 트랜잭션을 테스트하고 싶습니다. 여기에 내 코드가있다 :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>
@Transactional 어노테이션이있는 클래스가 Spring에 연결되어 있습니까? Spring은 프록시를 설정할 수 있도록 배선 작업을 수행해야합니다. – Pace
예. 할 수 있습니다.<속성 이름 = "sqlMapClient"ref = "sqlMapClient"/> . 내 거래 롤백을위한 오른쪽 차선에 있습니까? –
당신은 Spring에서 testDao 빈을 설정했지만 Spring에서 테스트에서 testDao 인스턴스를 얻나요? 전체 시험 수업을 게시 할 수 있습니까? – gdj