Откат транзакции в спящем режиме с пружиной работает неправильно - PullRequest
2 голосов
/ 28 ноября 2011

Spring 3.0.0 Hibernate 3 MySQL 5 JBoss 5

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

Интересно, что я создал небольшое тестовое Java-приложение, которое не использует Spring, но использует явное управление транзакциями Hibernate и использует точно такую ​​же конфигурацию Hibernate и ту же конфигурацию источника данных JBoss, и все работает отлично.Hibernate явно устанавливает автоматическую фиксацию в false, а затем возвращает ее в true после завершения транзакции.Откат корректно откатывает первое обновление.

Вот моя конфигурация Spring:

    <bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean">
        <property name="jndiName" value="java:TappDataMySqlDS" />
    </bean>

    <bean id="sessionFactory"
        class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"
        singleton="true">
        <property name="dataSource">
            <ref bean="dataSource" />
        </property>
        <property name="mappingResources">
                        <list>
                                <value>A.hbm.xml</value>
                                <value>B.hbm.xml</value>
                         </list>
        </property>
        <property name="hibernateProperties">
            <props>
                <prop key="hibernate.dialect">
                    org.hibernate.dialect.MySQLDialect
                </prop>
                <prop key="hibernate.show_sql">true</prop>
                <prop key="hibernate.format_sql">false</prop>
                <prop key="hibernate.use_sql_comments">false</prop>
                <prop key="hibernate.hbm2ddl.auto">update</prop>
                <prop key="hibernate.c3p0.min_size">5</prop>
                <prop key="hibernate.c3p0.max_size">20</prop>
                <prop key="hibernate.c3p0.timeout">300</prop>
                <prop key="hibernate.c3p0.max_statements">50</prop>
                <prop key="hibernate.c3p0.idle_test_period">3000</prop>
            </props>
        </property>
    </bean>

    <bean id="transactionManager"
    class="org.springframework.orm.hibernate3.HibernateTransactionManager">
        <property name="sessionFactory">
            <ref local="sessionFactory" />
        </property>
    </bean>

    <bean id="transactionAttributeSource"
class="org.springframework.transaction.interceptor.MatchAlwaysTransactionAttributeSource" />

    <bean id="com.tapp.tss.core.dao.SyncDAO" class="com.tapp.tss.core.dao.SyncDAO">
        <property name="sessionFactory">
            <ref local="sessionFactory" />
        </property>
    </bean>

    <bean id="dao.proxy.SyncDAO"
class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
        <property name="target" ref="com.tapp.tss.core.dao.SyncDAO" />
        <property name="transactionManager" ref="transactionManager" />
        <property name="transactionAttributes">
            <props>
                <prop key="*">PROPAGATION_REQUIRED</prop>
            </props>
        </property>
    </bean>

Код Дао:

public void save() {
Session session = org.springframework.orm.hibernate3.support.HibernateDaoSupport.getSession();

try {
A a = new A();
B b = new B();

a.setPropName("abc");
a.setPropValue("xyz");

b.setFieldName("abc");
b.setFieldValue("xyz");

a.getASet().add(b);

session.save(a);
session.flush();
} catch (HibernateException e) {
    e.printStackTrace();
        session.getTransaction().rollback();
}catch (Exception e) {
    e.printStackTrace();
}finally {
    if (autoConnRelease) {
        releaseSession(session);                
    }
}

Да, я много гуглил эту проблему, но не нашел решения.Понятия не имею, что не так.

Есть предложения?

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