-
spring的事务控制,嵌套调用时为何不起效0
我写的一个项目,用spring管理service层事务,利用<aop:config>织入service层,然后配置tx:advice,设置tx:method标签,name="delete*","insert*","update*",满足这三种特征的service方法,能正常实现再异常时回滚。但是,我在service定义了另外一个没有带着个特征的方法,比如
userRegedit(){}
在这个方法里调用"insert*"方法,未使用任何try catch,从控制台上看异常被抛出,但是事务却没回滚,请问这是为什么?难道说spring只能看到最终抛出异常的方法,被调用方法是不管的?2014年3月22日 11:53
5个答案 按时间排序 按投票排序
-
采纳的答案
http://www.cnblogs.com/daxin/p/3393855.html
你直接调用insertAAA 是Proxy.insertAAA() 代理对象加了事物。
你是调用的BBB 那么是这样的 proxy.BBB 代理对象调用了BBB方法。
然后你BBB里调用了AAA 那等于是这样的 target.aaa() 是目标对象调用的。
所以事物就不起作用了2014年3月24日 09:26
-
从问题的描述来看,问题出现在事务的传播上,可能你对事务的传播类型还不是很了解。不知道你在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 属性执行.
2014年3月23日 22:57
-
配置和代码贴出来看看。你这么用语言描述根本不知道你错在什么地方?Spring默认不会回滚Execption 默认只回滚RunTimeException以及其子类。
2014年3月22日 14:57
相关推荐
本示例“spring 事务传播 demo”将聚焦于Spring的事务传播行为,这是在多个方法调用中控制事务边界的关键概念。下面我们将详细讨论相关知识点。 首先,事务传播行为是指当一个被@Transactional注解的方法被另一个@...
springboot mybatis多数据源加事务嵌套 事务之间的调用 回滚 亲测可用 定义2个库分别建立 CREATE TABLE `user` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT '用户编号', `user_name` varchar(25) ...
嵌套事务允许独立于外部事务的回滚,但在外部事务回滚时,嵌套事务也会回滚。 #### 五、总结 通过上述分析,我们可以看出Spring中的事务传播行为提供了丰富的选项,可以帮助开发者精确地控制事务的执行逻辑。正确...
在"Spring事务传播Demo"中,我们可能看到如何在不同传播行为下,一个事务方法被另一个事务方法调用时,事务是如何管理和传播的。例如,一个PROPAGATION_REQUIRED的方法调用了一个PROPAGATION_REQUIRES_NEW的方法,...
在自调用的情况下,由于内部调用不会通过代理,因此事务管理器无法检测到这些内部调用,这可能导致事务嵌套不当或者事务行为丢失。为了解决这个问题,有以下几种策略: 1. **避免自调用**:尽可能地设计系统,使得...
方法被调用时自动开启事务,在事务范围内使用则使用同一个事务,否则开启新事务。 2、Propagation.REQUIRES_NEW 无论何时自身都会开启事务 3、Propagation.SUPPORTS 自身不会开启事务,在事务范围内则...
本DEMO主要探讨的是Spring事务的传播行为和隔离级别,这些概念对于理解和优化数据库操作至关重要。让我们深入理解这些概念及其实际应用。 首先,我们来谈谈事务的传播行为。在Spring中,当一个方法被另一个具有事务...
在Spring框架中,事务管理是实现业务逻辑时不可或缺的一部分,它确保了数据的一致性和完整性。Spring提供了多种事务管理方式,其中基于注解的事务管理是近年来常用的模式,因为它简化了代码并提高了可读性。本文将...
嵌套事务可以实现细粒度的事务控制,尤其是在需要回滚部分操作而不影响整个事务时。 #### 二、Spring事务的隔离级别(Isolation) 事务的隔离级别定义了事务之间相互隔离的程度,从而影响事务的一致性。Spring支持四...
虽然提供的示例是入门级别的,但它揭示了Spring事务管理的核心概念,为进一步学习和理解Spring事务处理的高级特性奠定了基础。在实际项目中,我们需要根据需求选择合适的配置,确保事务的正确性和数据的一致性。
Spring 框架是Java开发中...理解并熟练掌握Spring事务管理,对于提升应用程序的稳定性和可靠性至关重要。在实际开发中,结合声明式事务管理、事务传播行为、隔离级别和回滚规则,可以有效地确保数据的完整性和一致性。
6. **事务嵌套**:在同一个事务中调用另一个@Transactional方法,Spring会处理这种事务嵌套。默认情况下,子事务将继承父事务的隔离级别和传播行为。 7. **事物边界**:理解事务边界是确保事务正确性的关键。事务...
8. **事务嵌套**:Spring支持事务嵌套,当一个事务方法被另一个事务方法调用时,Spring会创建一个子事务,子事务的提交或回滚不影响父事务。 9. **事务隔离级别**:包括`READ_UNCOMMITTED`、`READ_COMMITTED`、`...
如果`Transaction1`不存在,则会为`Transaction2`创建一个新的事务。 2. **PROPAGATION_SUPPORTS** - **定义**:如果当前存在事务,则加入该事务;如果当前没有事务,则以非事务方式执行。 - **应用场景**:适用...
### Spring事务的传播特性和隔离级别 #### 一、事务的基本概念 在计算机科学中,事务(transaction)是指一系列操作的集合,这些操作要么全部成功完成,要么全部失败回滚,确保数据的一致性和完整性。事务具备四个...
在深入探讨Spring事务管理之前,我们需要先理解什么是事务。事务可以被定义为一系列的操作集合,这些操作作为一个整体被提交或回滚。简单来说,事务就是一个不可分割的工作单位,它包含的一系列操作要么全部成功,...
Spring 事务处理是Java开发中一个至关重要的概念,特别是在企业级应用中,它确保了数据的一致性和完整性。Spring 提供了两种主要的事务管理方式:编程式事务管理和声明式事务管理。本篇将深入探讨Spring声明式事务...
Spring事务管理的核心是基于AOP(面向切面编程)来实现的。 **Spring事务的本质**实际上是依赖于底层数据库提供的事务支持。如果没有数据库层面的支持,Spring无法单独实现事务的功能。在传统的JDBC操作中,如果想...
在Spring框架中,事务管理是核心功能之一,它允许开发者以声明式或编程式的方式处理事务边界。在本案例中,我们关注的是Spring中的Nested事务,这是一个相对复杂的特性,但非常有用,特别是在需要子事务处理的场景下...