0 0

spring使用声明事务不能回滚,请帮我看下原因3

初学spring,编写一个事务的例子,但是不能回滚。代码如下
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="homePlaceholderConfig" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
		<property name="location">
			<value>classpath:config.properties</value>
		</property>
	</bean>

	<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
		<property name="driverClassName">
			<value>${datasource.driverClassName}</value>
		</property>
		<property name="url">
			<value>${datasource.url}</value>
		</property>
		<property name="username">
			<value>${datasource.username}</value>
		</property>
		<property name="password">
			<value>${datasource.password}</value>
		</property>
	</bean>
	
	<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
		<property name="dataSource"><ref local="dataSource"/></property>
	</bean>
	
	<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
		<property name="dataSource">
			<ref local="dataSource" />
		</property>
	</bean>
	
	<bean id="txProxyTemplate" abstract="true" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
		<property name="transactionManager"><ref local="transactionManager"/></property>
		<property name="transactionAttributes">
			<props>
				<prop key="addUser">PROPAGATION_REQUIRED</prop>
			</props>
		</property>
	</bean>	
	
	<bean id="userDao" class="cn.com.home.dao.jdbc.UserDao" autowire="byName"></bean>
	<bean id="userServiceTarget" class="cn.com.home.service.UserService" autowire="byName"></bean>
	<bean id="userService" parent="txProxyTemplate" >
        <property name="target"><ref local="userServiceTarget"/></property>    
    </bean>

</beans>



dao代码
public class UserDao {
         private JdbcTemplate jdbcTemplate;

	/**
	 * @param jdbcTemplate
	 *            the jdbcTemplate to set
	 */
	public void setJdbcTemplate(JdbcTemplate jdbcTemplate) {
		this.jdbcTemplate = jdbcTemplate;
	}	

/**
	 * 
	 * @param user
	 */
	public void save(User user) throws DatabaseException {
		String sql = "insert into t_user (id,name,sex,age,city) values (?,?,?,?,?)";
		Object[] params = new Object[] { user.getId(), user.getName(),
				user.getSex(), user.getAge(), user.getCity() };
		try {
			jdbcTemplate.update(sql, params);
		} catch (Exception e) {
			log.error(e.getMessage(), e);
			throw new DatabaseException(e);
		}
	}

}

service代码
public class UserService{

	private UserDao userDao;

	/**
	 * @param userDao
	 *            the userDao to set
	 */
	public void setUserDao(UserDao userDao) {
		this.userDao = userDao;
	}

	/**
	 * @throws Exception
	 * 
	 */
	public void addUser() throws DatabaseException {
		User u = new User();
		u.setId(Long.valueOf(123));
		u.setName("张三");
		u.setAge(20);
		u.setSex("男");
		u.setCity(571);
		userDao.save(u);
		User u2 = new User();
		u2.setId(Long.valueOf(123));
		u2.setName("李四");
		u2.setAge(20);
		u2.setSex("男男男男男男男男男男男男男男男男男男男男男男男男男男");
		u2.setCity(571);
		userDao.save(u2);

	}

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		BeanFactory bf = new ClassPathXmlApplicationContext(
				"spring/applicationContext.xml");
		UserService service = (UserService) bf.getBean("userService");
		try {
			service.addUser();
		} catch (DatabaseException e) {
			
		}
	}

}


第二个user的sex故意设置成超过数据库字段长度的值,故意是inser出错。
但是为什么 这个事务没有回滚呢? 结果是第一个user插入到了数据库中。应该是两个都没有提交的。
2009年10月14日 18:01

3个答案 按时间排序 按投票排序

0 0

采纳的答案

自己看看你配置的

<property name="transactionAttributes">  
            <props>  
                <prop key="addUser">PROPAGATION_REQUIRED</prop>  
            </props>

没有配置回滚策略嘛,所以使用默认的回滚策略

默认的回滚策略:
任何RuntimeException将触发事务回滚,但是任何checked Exception将不触发事务回滚


你定义的那个throw new DatabaseException(e);这个异常应该是checked Exception吧


2009年10月14日 18:55
0 0

把DatabaseException类继承RuntimeException或其子类试试

2009年10月14日 20:42
0 0

你的配置修改为如下就行了:

            <props>  
                <prop key="addUser">PROPAGATION_REQUIRED,-DatabaseException</prop>  
            </props>



"-"表示发生指定异常后立即回滚

2009年10月14日 18:57

相关推荐

    Spring Boot多数据源(支持Spring声明式事务切换和回滚).pdf

    1. 基于Aspectj实现动态数据源...6. 实现事务内切换数据源(支持原生Spring声明式事务哟,仅此一家),并支持多数据源事务回滚(有了它除了跨服务的事务你需要考虑分布式事务,其他都不需要,极大的减少了系统的复杂程度)

    完美解决Spring声明式事务不回滚的问题

    下面小编就为大家带来一篇完美解决Spring声明式事务不回滚的问题。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧

    spring boot注解事务+多线程

    spring boot 纯注解方法事务控制回滚,注解+简单配置文件使用多线程demo

    深入理解Spring声明式事务:源码分析与应用实践

    Spring框架的声明式事务管理是Java开发中的核心特性,它为高效且可靠的数据操作提供了强大支持。...深入理解Spring声明式事务的工作原理,不仅能帮助开发者更高效地使用Spring框架,也是提升Java企业级开发能力的关键。

    06丨20%的业务代码的Spring声明式事务,可能都没处理正确

    06丨20%的业务代码的Spring声明式事务,可能都没处理正确 Spring 针对 Java Transaction API (JTA)、JDBC、Hibernate 和 Java Persistence API (JPA) 等事务 API,实现了一致的编程模型,而 Spring 的声明式事务功能...

    Spring 事务 代码

    spring 的声明式事务处理的简单例子。我已经测试过能用,能回滚。但例子是入门级别的,如果需要学更高深的请绕道。

    Spring2.5和Hibernate3集成--学习spring aop ioc

    * 默认事务回滚异常是RuntiimeException(包括所有继承RuntimeException的子类).普通异常不回滚 * 在编写业务逻辑方法时,最好将异常一直往上抛出,由表示层处理(Struts) * spring的事务管理需要添加到业务逻辑上...

    spring 声明式事务管理

    简单编写了一个银行转帐的事务管理程序,建立数据库表的sql亦包含在压缩包中,由于上传的限制,jar包需要自己导入一下...如果转账成功,事务正常结束,只要在转账过程中有一个错误,事务出错,便回滚,帐号上的钱数不变

    尚硅谷佟刚Spring4代码及PPT.rar

    JdbcDaoSupport、使用 NamedParameterJdbcTemplate、Spring 的声明式事务、事务的属性(传播行为、隔离级别、回滚属性、只读属性、过期时间)、使用 XML 文件的方式配置事务、整合 Hibernate、整合 Struts2 等。

    Spring 2.0 开发参考手册

    12.2.4. 不使用回调的基于Spring的DAO实现 12.2.5. 基于Hibernate3的原生API实现DAO 12.2.6. 编程式的事务划分 12.2.7. 声明式的事务划分 12.2.8. 事务管理策略 12.2.9. 容器资源 vs 本地资源 12.2.10. 在应用...

    Spring-Reference_zh_CN(Spring中文参考手册)

    12.2.4. 不使用回调的基于Spring的DAO实现 12.2.5. 基于Hibernate3的原生API实现DAO 12.2.6. 编程式的事务划分 12.2.7. 声明式的事务划分 12.2.8. 事务管理策略 12.2.9. 容器资源 vs 本地资源 12.2.10. 在应用服务器...

    spring高级编程详解

    Spring声明式事务让我们从复杂的事务处理中得到解脱。使得我们再也无需要去处理获得连接、关闭连接、事务提交和回滚等这些操作。再也无需要我们在与事务相关的方法中处理大量的try…catch…finally代码。

    Spring中文帮助文档

    12.2.4. 不使用回调的基于Spring的DAO实现 12.2.5. 基于Hibernate3的原生API实现DAO 12.2.6. 编程式的事务划分 12.2.7. 声明式的事务划分 12.2.8. 事务管理策略 12.2.9. 容器资源 vs 本地资源 12.2.10. 在应用...

    Spring声明式数据库事务的使用-隔离级别

    上面我们只是简单的使用事务,这里将讨论Spring事务机制中最重要的两个配置项,即隔离级别与传播行为。毫无疑问本节内容是本章的核心内容,也是互联网企业最关注的内容之一,因此他十分重要,值得花费大的篇幅去讨论...

    Spring API

    12.2.4. 不使用回调的基于Spring的DAO实现 12.2.5. 基于Hibernate3的原生API实现DAO 12.2.6. 编程式的事务划分 12.2.7. 声明式的事务划分 12.2.8. 事务管理策略 12.2.9. 容器资源 vs 本地资源 12.2.10. 在应用...

    Spring.html

    概念:面向切面编程,在不改变源码的情况下对方法进行增强,抽取横切关注点(日志处理,事务管理,安全检查,性能测试等等),使用AOP进行增强,使程序员只需要关注与业务逻辑编写. 专业术语 目标Target:需要增强的类 ...

    spring chm文档

    12.2.4. 不使用回调的基于Spring的DAO实现 12.2.5. 基于Hibernate3的原生API实现DAO 12.2.6. 编程式的事务划分 12.2.7. 声明式的事务划分 12.2.8. 事务管理策略 12.2.9. 容器资源 vs 本地资源 12.2.10. 在应用...

    Spring_Hibernate集成

    1、声明式事务配置 * 配置SessionFactory * 配置事务管理器 * 事务的传播特性 * 那些类那些方法使用事务 2、编写业务逻辑方法 * 继承HibernateDaoSupport类,使用HibernateTemplate来持久化,...

    第24次课-1 Spring与Hibernate的整合

    Spring通过ApplicationContext管理SessionFactory,可以不使用Hibernate应用必需的hibernate.cfg.xml。 Spring配置管理SessionFactory与数据库的连接,在实际的应用中,数据源会采用依赖注入的方式,传递给...

    seckill-ssm:使用spring+springMVC+MyBatis创建秒杀系统

    2、spring声明式事物只回滚运行期异常 3、使用注解控制事物方法的优点: (1) 开发团队达成一致约定,明确标注事务方法的编程风格 (2) 保证事务方法的执行时间尽可能短,不要穿插其他网络操作,如RPC/HTTP请求 或者...

Global site tag (gtag.js) - Google Analytics