2010-12-08 33 views
0

私は現在フレームワークとしてアプリケーションのspringを使用しています。私は春を使用してバッチトランザクションをテストしたい。私のコードはここにあります: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 Beanを設定しましたが、SpringからtestDaoインスタンスを取得していますか?テストクラス全体を投稿できますか? – gdj

答えて

5

は、MySQLのテーブルはInnoDBのタイプではないため、トランザクションが動作しないことがある:ここ

とは、XML構成です。

+0

いいえ、私はMyISAMを使用しています。 –

+2

+1 - MyISAMはトランザクションをサポートしていません。 http://dev.mysql.com/doc/refman/5.1/ja/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> 

どちらの方法でも、ここでSpring XML設定を追加して診断のヘルプを追加する必要があります。詳細については、Transaction Managementを参照してください。

+0

私はすでにそれを設定しています。上記の私のポストでもう一度それを確認してください。ありがとう。 –

関連する問題