论坛首页 入门技术论坛

SPRING事务回滚问题

浏览 5979 次
该帖已经被评为新手帖
作者 正文
   发表时间:2008-04-10  
我是spring初学者,这个问题困扰好长一段时间了,我一直没看明白,为什么我的事务没有被回滚,知道的告诉下谢谢。
配置文件
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
<beans>
<bean id="dataSource"
class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName">
<value>com.mysql.jdbc.Driver</value>
</property>
<property name="url">
<value>jdbc:mysql://localhost:3306/zhangchiex</value>
</property>
<property name="username">
<value>root</value>
</property>
<property name="password">
<value>password</value>
</property>
</bean>
<!-- The dataSource -->

<bean id="transactionManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource">
<ref bean="dataSource" />
</property>
</bean>
<!-- 事物管理器,这里是JDBC事务管理器 -->

<bean id="ticketServiceTarget"
class="sty.serviceImpl.TicketServiceImpl">
<property name="dataSource">
<ref bean="dataSource" />
</property>
</bean><!-- 事务代理的目标 -->



<bean id="ticketService"
class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
<property name="proxyInterfaces">
<list>
<value>sty.service.TicketService</value>
</list>
</property>
<property name="target">
<ref bean="ticketServiceTarget" />
</property>
<property name="transactionManager">
<ref bean="transactionManager" />
</property>
<property name="transactionAttributes">
<props>
<prop key="insert">PROPAGATION_REQUIRED,-Exception</prop>
</props>
</property>
</bean>
</beans>

下面是目标类的代码:
package sty.serviceImpl;

public class TicketServiceImpl implements TicketService {
private DataSource dataSource;

public DataSource getDataSource() {
return dataSource;
}

public void setDataSource(DataSource dataSource) {
this.dataSource = dataSource;
}

public void insert() {
boolean flag = true;
try {
JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource);
jdbcTemplate.update("insert into user value(2,'yuna','032012')");
if(flag) {
throw new Exception("my exception");//抛出异常
}
System.out.println("over");
} catch (Exception e) {
System.out.println("exception");
e.printStackTrace();
}

}
}
知道的告诉下谢谢
   发表时间:2008-04-10  
没有抛出异常,怎么回滚呢?

LZ你看看你的insert方法没有抛出任何异常啊
0 请登录后投票
   发表时间:2008-04-10  
找了好久发现原因了,也谢谢楼上指教,确实是自己没有将异常从insert方法中抛出,而是在insert方法内部处理掉了,所以导致事务无法回滚,也不知道我理解的对不,不过我将异常从insert方法抛出后就正确回滚了,搞了好几天了,今天能开心的回去吃晚饭 哈哈
0 请登录后投票
   发表时间:2008-04-10  
<prop key="insert">PROPAGATION_REQUIRED,-Exception</prop>

意思就是如果insert方法抛出Exception异常的子类,就回滚
0 请登录后投票
   发表时间:2008-04-10  
我觉得既然用JdbcTemplate了,应该继承JdbcDaoSupport,我都是这么做的,不知大家的意见如何
0 请登录后投票
   发表时间:2008-04-10  
同意。继承JdbcDaoSupport,会使事情变的更简单一些
0 请登录后投票
   发表时间:2008-10-30  
     我也碰到同样的问题了,一直想不出是为什么,我的配置文件是这样写的,见下,我想在不使用事务的条件下应该就不存在事务回滚了,到是没有试过像你那样直接抛出异常,而且我的程序里只要是访问数据的地方都会回滚。但是查询是可以出结果,更新和插入就不会成功,想不出为什么,
<?xml version="1.0" encoding="UTF-8"?>  
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">  
 
<beans>     
    <bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean">  
        <property name="jndiName">  
            <value>jdbc/sysdb</value>  
        </property>  
    </bean>  
 
    <bean id="sessionFactory" 
        class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">   
        <property name="dataSource">  
            <ref bean="dataSource" />  
        </property>  
        <property name="mappingResources">  
            <list>  
                <value>  
                    com/sunyard/ispt/model/TableNotice.hbm.xml  
                </value>  
                <value>  
                    com/sunyard/ispt/model/TableMaterial.hbm.xml  
                </value>  
                <value>  
                    com/sunyard/ispt/model/TableQuestion.hbm.xml  
                </value>                    
                <value>com/sunyard/ispt/model/TableRule.hbm.xml  
                </value>  
                <value>com/sunyard/ispt/model/TablePaper.hbm.xml</value>  
                <value>  
                    com/sunyard/ispt/model/TableResult.hbm.xml  
                </value>  
                <value>  
                    com/sunyard/ispt/model/TableConfig.hbm.xml  
                </value>  
                <value>com/sunyard/ispt/model/TablePower.hbm.xml</value>  
                </list>  
        </property>  
        <property name="hibernateProperties">  
            <props>  
                <prop key="hibernate.dialect">  
                    org.hibernate.dialect.SQLServerDialect  
                </prop>  
                <prop key="hibernate.show_sql">true</prop>  
                <prop key="hibernate.query.factory_class">  
                    org.hibernate.hql.classic.ClassicQueryTranslatorFactory  
                </prop>  
            </props>  
        </property>  
    </bean>     
    <!-- 配置使用Hibernate局部事务策略 -->  
    <bean id="transactionManger" 
        class="org.springframework.orm.hibernate3.HibernateTransactionManager">  
        <property name="sessionFactory" ref="sessionFactory"></property>  
    </bean>  
    <!-- 配置一个事务拦截器 -->  
    <bean id="transactionInterceptor" 
        class="org.springframework.transaction.interceptor.TransactionInterceptor">  
        <!-- 事务拦截器Bean需要依赖注入一个事务管理器 -->  
        <property name="transactionManager" ref="transactionManger"></property>  
        <property name="transactionAttributes">  
            <!-- 下面定义事务传播属性 -->  
            <props>     
                <prop key="insert*">PROPAGATION_REQUIRED</prop>           
            </props>  
        </property>  
    </bean>     
</beans> 
0 请登录后投票
论坛首页 入门技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics