весна @Transactional не работает? - PullRequest
0 голосов
/ 08 декабря 2010

Я сейчас создаю приложение, использующее Spring в качестве фреймворка. и я хочу проверить пакетную транзакцию с помощью весны. вот мой код:

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";
}

при выполнении с идентификатором 1 будет выдано сообщение об ошибке, и я ожидаю, что весь запрос будет откат но 7 попадают в базу данных. почему нельзя откатить? где я не прав?

я использую ibatis и mysql в качестве базы данных.

и вот конфигурация xml:

<!-- 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>

Ответы [ 2 ]

5 голосов
/ 08 декабря 2010

Возможно, транзакция не работает, потому что ваша таблица mysql не относится к типу InnoDB.

1 голос
/ 08 декабря 2010

Есть ли у вас все необходимые элементы, определенные в вашей конфигурации 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 здесь для получения дополнительной помощи по диагностике. См. Управление транзакциями для получения дополнительной информации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...