-
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个答案 按时间排序 按投票排序
-
采纳的答案
自己看看你配置的
<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
-
你的配置修改为如下就行了:
<props>
<prop key="addUser">PROPAGATION_REQUIRED,-DatabaseException</prop>
</props>
"-"表示发生指定异常后立即回滚2009年10月14日 18:57
相关推荐
1. 基于Aspectj实现动态数据源...6. 实现事务内切换数据源(支持原生Spring声明式事务哟,仅此一家),并支持多数据源事务回滚(有了它除了跨服务的事务你需要考虑分布式事务,其他都不需要,极大的减少了系统的复杂程度)
下面小编就为大家带来一篇完美解决Spring声明式事务不回滚的问题。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
spring boot 纯注解方法事务控制回滚,注解+简单配置文件使用多线程demo
Spring框架的声明式事务管理是Java开发中的核心特性,它为高效且可靠的数据操作提供了强大支持。...深入理解Spring声明式事务的工作原理,不仅能帮助开发者更高效地使用Spring框架,也是提升Java企业级开发能力的关键。
06丨20%的业务代码的Spring声明式事务,可能都没处理正确 Spring 针对 Java Transaction API (JTA)、JDBC、Hibernate 和 Java Persistence API (JPA) 等事务 API,实现了一致的编程模型,而 Spring 的声明式事务功能...
spring 的声明式事务处理的简单例子。我已经测试过能用,能回滚。但例子是入门级别的,如果需要学更高深的请绕道。
* 默认事务回滚异常是RuntiimeException(包括所有继承RuntimeException的子类).普通异常不回滚 * 在编写业务逻辑方法时,最好将异常一直往上抛出,由表示层处理(Struts) * spring的事务管理需要添加到业务逻辑上...
简单编写了一个银行转帐的事务管理程序,建立数据库表的sql亦包含在压缩包中,由于上传的限制,jar包需要自己导入一下...如果转账成功,事务正常结束,只要在转账过程中有一个错误,事务出错,便回滚,帐号上的钱数不变
JdbcDaoSupport、使用 NamedParameterJdbcTemplate、Spring 的声明式事务、事务的属性(传播行为、隔离级别、回滚属性、只读属性、过期时间)、使用 XML 文件的方式配置事务、整合 Hibernate、整合 Struts2 等。
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. 在应用...
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声明式事务让我们从复杂的事务处理中得到解脱。使得我们再也无需要去处理获得连接、关闭连接、事务提交和回滚等这些操作。再也无需要我们在与事务相关的方法中处理大量的try…catch…finally代码。
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事务机制中最重要的两个配置项,即隔离级别与传播行为。毫无疑问本节内容是本章的核心内容,也是互联网企业最关注的内容之一,因此他十分重要,值得花费大的篇幅去讨论...
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. 在应用...
概念:面向切面编程,在不改变源码的情况下对方法进行增强,抽取横切关注点(日志处理,事务管理,安全检查,性能测试等等),使用AOP进行增强,使程序员只需要关注与业务逻辑编写. 专业术语 目标Target:需要增强的类 ...
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. 在应用...
1、声明式事务配置 * 配置SessionFactory * 配置事务管理器 * 事务的传播特性 * 那些类那些方法使用事务 2、编写业务逻辑方法 * 继承HibernateDaoSupport类,使用HibernateTemplate来持久化,...
Spring通过ApplicationContext管理SessionFactory,可以不使用Hibernate应用必需的hibernate.cfg.xml。 Spring配置管理SessionFactory与数据库的连接,在实际的应用中,数据源会采用依赖注入的方式,传递给...
2、spring声明式事物只回滚运行期异常 3、使用注解控制事物方法的优点: (1) 开发团队达成一致约定,明确标注事务方法的编程风格 (2) 保证事务方法的执行时间尽可能短,不要穿插其他网络操作,如RPC/HTTP请求 或者...