spring的事务控制,嵌套调用时为何不起效

问题描述

我写的一个项目,用spring管理service层事务,利用<aop:config>织入service层,然后配置tx:advice,设置tx:method标签,name="delete*","insert*","update*",满足这三种特征的service方法,能正常实现再异常时回滚。但是,我在service定义了另外一个没有带着个特征的方法,比如userRegedit(){}在这个方法里调用"insert*"方法,未使用任何try catch,从控制台上看异常被抛出,但是事务却没回滚,请问这是为什么?难道说spring只能看到最终抛出异常的方法,被调用方法是不管的?

解决方案

http://www.cnblogs.com/daxin/p/3393855.html你直接调用insertAAA 是Proxy.insertAAA() 代理对象加了事物。你是调用的BBB 那么是这样的 proxy.BBB 代理对象调用了BBB方法。然后你BBB里调用了AAA 那等于是这样的 target.aaa() 是目标对象调用的。所以事物就不起作用了
解决方案二:
需要不同的方法放到不同的类里,然后再配重开事务,这样就可以啦
解决方案三:
从问题的描述来看,问题出现在事务的传播上,可能你对事务的传播类型还不是很了解。不知道你在tx:method中怎样配置的事务传播类型。你可以使用类似下面的配置,对说有函数使用SUPPORTS类型的事务传播级别<tx:advice id="transactionAdvice" transaction-manager="transactionManager"> <tx:attributes> <tx:method name="insert*" propagation="REQUIRED" /> <tx:method name="update*" propagation="REQUIRED" /> <tx:method name="delete*" propagation="REQUIRED" /> <tx:method name="*" propagation="SUPPORTS" read-only="true" /> </tx:attributes></tx:advice>事务传播类型:PROPAGATION_REQUIRED: 如果存在一个事务, 则支持当前事务. 如果没有事务则开启一个新的事务.<--常用 PROPAGATION_SUPPORTS: 如果存在一个事务, 支持当前事务. 如果没有事务, 则非事务的执行.<--常用 PROPAGATION_MANDATORY: 如果已经存在一个事务, 支持当前事务. 如果没有一个活动的事务, 则抛出异常. PROPAGATION_REQUIRES_NEW: 总是开启一个新的事务. 如果一个事务已经存在, 则将这个存在的事务挂起.<--嵌套事务 PROPAGATION_NOT_SUPPORTED: 总是非事务地执行, 并挂起任何存在的事务 PROPAGATION_NEVER: 总是非事务地执行, 如果存在一个活动事务, 则抛出异常 PROPAGATION_NESTED: 如果一个活动的事务存在, 则运行在一个嵌套的事务中. 如果没有活动事务, 则按TransactionDefinition.PROPAGATION_REQUIRED 属性执行.
解决方案四:
userRegedit方法中如果使用this调用本类的方法,这个方法并不是经过spring代理对象调用,所以AOP的切入是没有的。
解决方案五:
配置和代码贴出来看看。你这么用语言描述根本不知道你错在什么地方?Spring默认不会回滚Execption 默认只回滚RunTimeException以及其子类。

时间: 2024-10-29 12:22:40

spring的事务控制,嵌套调用时为何不起效的相关文章

Spring事务传播特性的浅析——事务方法嵌套调用的迷茫

  Spring事务传播机制回顾     Spring事务一个被讹传很广说法是:一个事务方法不应该调用另一个事务方法,否则将产生两个事务.结果造成开发人员在设计事务方法时束手束脚,生怕一不小心就踩到地雷. 其实这是不认识Spring事务传播机制而造成的误解,Spring对事务控制的支持统一在TransactionDefinition类中描述,该类有以下几个重要的接口方法:  int getPropagationBehavior():事务的传播行为 int getIsolationLevel():

spring事务控制转账问题

问题描述 spring事务控制转账问题 例:A账户金额有1000元,另有B账户,C账户:现有两个独立事务同时进行: 1,将A账户的1000块钱转到B账户: 2,将A账户的1000块钱转到C账户: 事务的操作:A,-1000 B/C,+1000: 是不是会存在这种情况: 执行事务时,由于没有真正修改数据库,两个事务都是合法: 执行完事务,实际保存数据时,后保存数据A账户钱数会报错(金额不会修改),而C账户钱会增加: 导致,B,C账户增加总和大于A账户减少的金额? 解决方案 spring事务问题:没

spring mvc+hibernate4事务控制

问题描述 spring mvc+hibernate4事务控制 web.xml <?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://

面试题--关于spring事务控制的

问题描述 上周去面试,面试官问我,spring事务控制放在service层,在service方法中一个方法调用service中的另一个方法,默认开启几个事务? 解决方案 一个.spring的事务传播方式默认是PROPAGATION_REQUIRED,也就是加入当前事务(如果没有就开启一个新事务).解决方案二:默认PROPAGATION_REQUIRED,判断当前是否已开启一个新事务,有则加入当前事务,否则新开一个.共有7种方式.

SpringMVC与Mybatis集合实现调用存储过程、事务控制实例_java

在SSM框架中经常会用到调用数据库中的存储过程.以及事务控制,下面以保存某单据为例,介绍一下: 1.Oracle中存储过程代码如下(主要逻辑将单据编码自动加1,并将该单据编码返回): CREATE OR REPLACE PROCEDURE "UPDATE_DJBHZT" (p_GSID in varchar2, p_TBLNAME in varchar2, NewRecNo out Number) as begin update BHDJ set BHDJ02 = BHDJ02+1 w

我调用excel 打开jsp页面,jsp代码打开会出现下载excel文件 ,怎么控制excel 打印时为默认为横向

问题描述 我调用excel打开jsp页面,jsp代码打开会出现下载excel文件,怎么控制excel打印时为默认为横向

sping hibernate 事务-spring注解方式事务控制没有回滚

问题描述 spring注解方式事务控制没有回滚 项目中使用到了hibernate以及spring事务控制,在service层增加事务控制但是遇到异常没有回滚. 代码如下: 配置文件 <?xml version="1.0" encoding="UTF-8"?> xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springfr

spring data jpa + spring mvc的事务控制问题

问题描述 spring data jpa + spring mvc的事务控制问题 问题大概是这样的,如下@Transactionalpublic void save(A a){ a = aRepository.save(a); B b = new B();b.setAId(a.getId());bRepository.save(b); }这样是获取不到a对象的id的,因为方法没有执行完,这个事务没有提交,数据没有更新到数据库,请问如果我想在save之后通过返回的对象就能拿到主键需要怎么做,事务是

spring mvc +hibernate4事务控制问题求大神解答

问题描述 spring mvc +hibernate4事务控制问题求大神解答 web.xml <?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="