Spring управляемая проблема транзакции с Teradata - PullRequest
0 голосов
/ 14 апреля 2011

В моем приложении транзакции гибернации управляются 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 (с транзакцией, управляемой пружиной)?

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