Откат Spring Programmatic Jdbc Transaction не работает

Я использую транзакцию Spring, чтобы включить несколько операций обновления БД в одну транзакцию. скажем, есть 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(). Помогите, пожалуйста, объяснить, что здесь не так?

Дара кок,


person piggyback    schedule 30.01.2011    source источник


Ответы (1)


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

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

person piggyback    schedule 30.01.2011
comment
Не могли бы вы добавить больше описания к своему вопросу (с указанием MyISAM) и пометить его как ответ? (против вашего ответа :)) - person uncaught_exceptions; 30.01.2011