Spring Programmatic Откат транзакции Jdbc не работает - PullRequest
2 голосов
/ 30 января 2011

Я использую весеннюю транзакцию, чтобы включить операцию обновления в несколько дБ в одну транзакцию.скажем там 2 дБ обновлений за одну транзакцию.обновление 1 успешно, а второе - неудачно.Моя проблема заключается в том, что когда происходит такой случай, первое обновление БД фиксируется в БД, даже если второе обновление БД не удалось, что приводит к откату транзакции.

Объявление XML:

<bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"/>
</bean>

<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"> 
<property name="driverClassName" value="com.mysql.jdbc.Driver" /> 
<property name="url" value="jdbc:mysql://localhost:3306/test" /> 
<property name="username" value="test" /> 
<property name="password" value="test" /> 
</bean>

<bean id="testDao" class="dao.TestDao">
<constructor-arg >
<ref local="simpleJdbcTemplate" />         
</constructor-arg>
<constructor-arg >
<ref local="txManager" />         
</constructor-arg>  
</bean>

Java-код:

public class DaoCallback extends TransactionCallbackWithoutResult {
 protected void doInTransactionWithoutResult(TransactionStatus arg0) {
try{
    dbUpdate1();
    dbUpdate2();
}catch(Exception e){
    arg0.setRollbackOnly();
    }
}

я намеренно делаю dbUpdate1 успешным, а dbUpdate2 неудачным, чтобы проверить, действительно ли откат работает.Когда я отлаживаю свой код, я вижу, что поток управления запускает исключение catch и вызывается метод "setRollbackOnly ()".

Но когда я проверяю базу данных, я вижу изменение из dbUpdate1().Поэтому, пожалуйста, помогите объяснить, что здесь не так?

Дара Кок,

1 Ответ

4 голосов
/ 30 января 2011

Я обнаружил проблему. Проблема не в том коде, который у меня есть. это конфигурация хранения данных MySQL. MyISAM не поддерживает транзакции.

Spring должен был показать какое-то сообщение об ошибке, чтобы разработчик мог знать, что транзакция вызывается на ядре базы данных без поддержки транзакции.

...