就贴applicationContext.xml和TestService吧。
我在TestService的save里,调用3次DAO保存数据,第3个因为太长所以会抛异常,按理来说前面2个应该回滚才对,但是仍然保存到数据库了。用的是mysql。。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd"><beans>
<!--  org.springframework.jdbc.datasource.DriverManagerDataSource-->
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
<property name="driverClassName" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://127.0.0.1/test"/>
<property name="username" value="root"/>
<property name="password" value="76554792"/>
</bean> <bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="dataSource" ref="dataSource"/>
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>
<prop key="hibernate.current_session_context_class">thread</prop>
<prop key="hibernate.transaction.factory_class">org.hibernate.transaction.JDBCTransactionFactory</prop>
</props>
</property>
<property name="mappingResources">
<list>
<value>entity/Classes.hbm.xml</value>
<value>entity/Student.hbm.xml</value>
</list>
</property>
</bean> <bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory"/>
</bean> <bean name="testDAO" class="dao.TestDAO">
<property name="sessionFactory" ref="sessionFactory"/>
</bean> <bean name="testService" class="service.TestService">
<property name="testDAO" ref="testDAO"/>
</bean> <bean name="/test" class="action.TestAction">
<property name="testService" ref="testService"/>
</bean>

<bean id="TestServiceProxy" abstract="false" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
<property name="transactionManager" ref="transactionManager"/>
<property name="target" ref="testService"/>
<property name="transactionAttributes">
<props>
<prop key="search*">PROPAGATION_REQUIRED,readOnly,-Exception</prop>
<prop key="*">PROPAGATION_REQUIRED,-Exception</prop>
</props>
</property>
</bean>
</beans>package service;import java.util.List;import dao.TestDAO;
import entity.Classes;public class TestService 
{
TestDAO testDAO;
public void save()
{
Classes c1 = new Classes();
c1.setId(10);
c1.setName("10");
testDAO.save(c1);

Classes c2 = new Classes();
c2.setId(11);
c2.setName("11");
testDAO.save(c2);

Classes c3 = new Classes();
c3.setId(12);
c3.setName("12222222222222222222222222222222222222222222222222222222222");
testDAO.save(c3);
}

public TestDAO getTestDAO() {
return testDAO;
} public void setTestDAO(TestDAO testDAO) {
this.testDAO = testDAO;
}
}

解决方案 »

  1.   

    你的事物边界在哪里呢???给你一段示例吧
    <beans> <bean id="baseDao" class="com.dao.BaseDAOImp">
    <property name="hibernateBaseDao">
    <ref bean="hibernateBaseDao" />
    </property>
    </bean>

       <bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
    <property name="dataSource">
    <ref bean="chnds" />
    </property>
    <property name="mappingDirectoryLocations">
    <list>
        <value>/sitech/res/s99899/hbm</value>
    </list>
    </property>
    <property name="hibernateProperties">
    <props>
    <prop key="hibernate.dialect">org.hibernate.dialect.Oracle9Dialect</prop>
    <prop key="hibernate.use_outer_join">false</prop>
    <prop key="hibernate.show_sql">true</prop>
    <prop key="hibernate.query.factory_class">org.hibernate.hql.classic.ClassicQueryTranslatorFactory</prop>
    </props>
    </property>
    </bean>

    <bean id="hibernateBaseDao" class="com.dao.HibernateBaseDao">
    <property name="sessionFactory">
    <ref bean="sessionFactory" />
    </property>
    </bean>
    <bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
    <property name="sessionFactory">
    <ref bean="sessionFactory" />
    </property>
    </bean> <bean id="transactionAdvisor" class="org.springframework.transaction.interceptor.TransactionAttributeSourceAdvisor">
    <property name="transactionInterceptor" ref="transactionInterceptor" />
    </bean>
    <bean id="transactionInterceptor" class="org.springframework.transaction.interceptor.TransactionInterceptor">
    <property name="transactionManager" ref="transactionManager" />
    <property name="transactionAttributes">
    <props>
    <prop key="*">PROPAGATION_REQUIRED,-Exception</prop>
    <prop key="find*">PROPAGATION_REQUIRED,readOnly</prop>
    <prop key="query*">PROPAGATION_REQUIRED,readOnly</prop>
    <prop key="get*">PROPAGATION_REQUIRED,readOnly</prop>

    </props>

    </property>
    </bean>    
        
    <bean id="beanproxy" class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">
    <property name="beanNames">
    <value>*Svr,*svr</value>
    </property>
    <property name="interceptorNames">
    <list>
    <value>transactionAdvisor</value>
    </list>
    </property>
    </bean> <bean id="logAfterAdvisor" class="org.springframework.aop.support.RegexpMethodPointcutAdvisor">
    <property name="advice">
    <ref local="logAfterAdvice" />
    </property>
    <property name="pattern">
    <value>.*</value>
    </property>
    </bean>
    <bean id="privilegeBeforeAdvisor" class="org.springframework.aop.support.RegexpMethodPointcutAdvisor">
    <property name="advice">
    <ref local="privilegeBeforeAdvice" />
    </property>
    <property name="pattern">
    <value>.*</value>
    </property>
    </bean> </beans>
      

  2.   


    后面这两个加了就有错,去掉了就可以回滚了<bean id="logAfterAdvisor" class="org.springframework.aop.support.RegexpMethodPointcutAdvisor">
            <property name="advice">
                <ref local="logAfterAdvice" />
            </property>
            <property name="pattern">
                <value>.*</value>
            </property>
        </bean>
        <bean id="privilegeBeforeAdvisor" class="org.springframework.aop.support.RegexpMethodPointcutAdvisor">
            <property name="advice">
                <ref local="privilegeBeforeAdvice" />
            </property>
            <property name="pattern">
                <value>.*</value>
            </property>
        </bean>
      

  3.   

    <!-- 声明式事务 -->
    <bean id="txManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
    <property name="sessionFactory" ref="sessionFactory"></property>
    </bean>
    <tx:advice id="txadvice" transaction-manager="txManager">
    <tx:attributes>
    <tx:method name="*" propagation="REQUIRED"/>
    </tx:attributes>
    </tx:advice>
    <aop:config>
                    //execution(* com.biz.impl.*.*(..))指定所要绑定的类,方法等
    <aop:pointcut expression="execution(* com.biz.impl.*.*(..))" id="p"/>
    <aop:advisor advice-ref="txadvice" pointcut-ref="p"/>
    </aop:config>
    这是我项目的部分代码,你看哈合你要求不
      

  4.   

    我给你的那个配置,删掉了一些东西哈,后面这个是还没删完的哈<bean id="logAfterAdvisor" class="org.springframework.aop.support.RegexpMethodPointcutAdvisor">
            <property name="advice">
                <ref local="logAfterAdvice" />
            </property>
            <property name="pattern">
                <value>.*</value>
            </property>
        </bean>
        <bean id="privilegeBeforeAdvisor" class="org.springframework.aop.support.RegexpMethodPointcutAdvisor">
            <property name="advice">
                <ref local="privilegeBeforeAdvice" />
            </property>
            <property name="pattern">
                <value>.*</value>
            </property>
        </bean>
      

  5.   

    就是后面那2个bean有错嘛,我删掉就对了。。