В моем приложении транзакции гибернации управляются Spring AOP и использует Teradata в качестве базы данных.
НАСТОЯЩИЕ ВОПРОСЫ ОСОБЕННЫ ДЛЯ ТЕРАДАННЫХ, И ОДИН ИЗ ТОГО ЖЕ КОДА РАБОТАЕТ В MYSQL.принимает список объектов в качестве параметров и проверяет, является ли он измененным или нет, проверяя его с данными из базы данных.
После этого он вызывает класс DAO, который сохраняет данные в базе данных.
Метод ServiceClassaop:
<tx:advice id="txAdviceForService"
transaction-manager="transactionManager">
<tx:attributes>
<tx:method name="save" isolation="READ_COMMITTED"/>
</tx:attributes>
</tx:advice>
ServiceClass:
public void save(List<Test> testList) {
DAOClass daoClass;
boolean isUpdated = false ;
for (Test test : testList) {
Test testInDB = this.sessionFactory.getCurrentSession().get(
Test.class, test.getId());
if(! test.getName().equals(testIndDB)) {
isUpdated = true ;
break;
}
}
daoClass.save(testList);
if(isUpdated) {
// do some processing
}
}
DAOClass:
public void save(List<Test> testList) {
for (Test test : testList) {
try {
this.sessionFactory.getCurrentSession().saveOrUpda te(test);
session.flush();
} catch (HibernateException e) {
///
}
}
}
DAOClass method's aop:
<tx:advice id="txAdviceForDAO"
transaction-manager="transactionManager">
<tx:attributes>
<tx:method name="save" propagation="REQUIRES_NEW" />
</tx:attributes>
</tx:advice>
Код управления транзакциями:
<aop:config>
<aop:advisor advice-ref="txAdviceForService"
pointcut="execution(* ServiceClass.*(..))" />
<aop:advisor advice-ref="txAdviceForDAO"
pointcut="execution(* DAOClass.*(..))" />
</aop:config>
Здесь, когда службакласс вызывает метод save класса DAO, он запускается в новой транзакции, как указано выше в коде AOP.
Проблема заключается в том, что класс обслуживания считывает объект из базы данных в одной транзакции, а затем вызывает метод, который запускает новую транзакцию длясохранить данные.Когда он вызывает session.flush, таблица блокируется и не может получить доступ даже из внешнего приложения, а приложение зависает.
Если я помещаю код сохранения данных из DAO в класс обслуживания, то он работает нормальнопотому что он находится в той же транзакции.
Кто-нибудь сталкивался с подобной проблемой при использовании Hibernate с Teradata (с транзакцией, управляемой пружиной)?