Spring @Transactional: информация об откате, сообщенная, но фактически не выполненная

#java #unit-testing #spring #testing #junit

#java #модульное тестирование #spring #тестирование #junit

Вопрос:

Я прокомментировал свои тестовые классы следующим образом:

 @RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations={"file:WebContent/WEB-INF/applicationContext.xml", "file:WebContent/WEB-INF/context-aspects.xml"})
@Transactional
public class MyTest {

}
  

Однако при выполнении тестов тестовая база данных внезапно заполняется значениями, хотя @Transactional включен, и я могу прочитать следующее в журнале:

 INFO: Began transaction (4): transaction manager [org.springframework.orm.hibernate3.HibernateTransactionManager@669aa3f3]; rollback [true]
07.04.2011 23:57:33 org.springframework.test.context.transaction.TransactionalTestExecutionListener endTransaction
INFO: Rolled back transaction after test execution for test context ...
  

Есть идеи, почему фактический откат после тестового примера не выполняется?

Обновление: Если я использую HSQLDB, у меня нет этих проблем — так это проблема mysql?

Комментарии:

1. Какой компонент database engine вы используете?

2. В случае MySQL, какой тип вы используете: MyISAM или InnoDB?

3. Я использую MySQL InnoDB. В другом проекте он работает с той же базой данных, но я не могу выяснить, в чем различия в конфигурациях.

Ответ №1:

Обновление: если я использую HSQLDB, у меня нет этих проблем — так это проблема mysql?

Да, вы правы.

Убедитесь, что вы используете правильный диалект (при использовании Hibernate: org.hibernate.dialect.MySQL5InnoDBDialect), и, возможно, вам следует отслеживать инструкции, которые были отправлены в базу данных.

Ответ №2:

Я смог, наконец, решить проблему. Hibernate генерировал таблицы MyISAM, которые, по-видимому, не поддерживают транзакции. Это произошло из-за неправильно настроенного диалекта гибернации. Я использовал org.hibernate.dialect.MySQL5Dialect, но org.hibernate.dialect.Требуется MySQL5InnoDBDialect.