`
- 浏览:
802637 次
- 性别:
- 来自:
上海
-
Spring注解事物@Transactional不工作
“In proxy mode (which is the default), only external method calls coming in through the proxy are intercepted. This means that self-invocation, in effect, a method within the target object calling another method of the target object, will not lead to an actual transaction at runtime even if the invoked method is marked with @Transactional.
在默认的代理模式下,只有目标方法由外部调用,才能被 Spring 的事务拦截器拦截。在同一个类中的两个方法直接调用,是不会被 Spring 的事务拦截器拦截,就像上面的 save 方法直接调用了同一个类中的 method1方法,method1 方法不会被 Spring 的事务拦截器拦截。可以使用 AspectJ 取代 Spring AOP 代理来解决这个问题,但是这里暂不讨论。”
以上内容来自链接:
Spring Boot 中使用 @Transactional 注解配置事务管理
https://blog.csdn.net/nextyu/article/details/78669997
以上内容肉测发现确实是这个问题,刚开始事物方法定义为私有的,当然不行,后面以为是抛出的异常不是RuntimeException,但是事实上Spring已经封装了一层,所以其实所有的异常经过Spring重新抛出后就已经是RuntimeExeption的了,最后才发现是因为同一个类的方法A调用事物方法B的问题,将事物方法B放到单独的类,然后方法A再调用方法B,事物生效。
另外需要明确几点:
默认配置下 Spring 只会回滚运行时、未检查异常(继承自 RuntimeException 的异常)或者 Error。参考这里
@Transactional 注解只能应用到 public 方法才有效。
对于自调用获同一个类中调用的解决方案:
1)放到单独的类中变成外部调用
2)获取对应的代理类,调代理类上的同名方法
a)配置
@EnableAspectJAutoProxy(exposeProxy=true)
public class Bootstrap {
}
b)调用方式
int[] effectedRows = ((SkuBasicCreationServiceImpl)AopContext.currentProxy()).createSkuWithTransaction(skuCreationDO, skuBarCodeDOs, skuMUnitDOs, skuTaxClsDO);
事务注解Transactional在同一个类中调用的失效问题
[url]https://blog.csdn.net/ligeforrent/article/details/79996797[/url]
spring @transactional public和自调用方法的问题处理
https://blog.csdn.net/zy_281870667/article/details/77164312
springboot的注解@EnableAspectJAutoProxy讲解
https://blog.csdn.net/pml18710973036/article/details/61654277
分享到:
Global site tag (gtag.js) - Google Analytics
相关推荐
在Spring框架中,`@Transactional`注解是事务管理的核心组件,它允许开发者在方法级别声明事务边界。本文将深入探讨这个注解的工作原理、如何配置以及如何在遇到异常时触发事务回滚。 首先,`@Transactional`是...
在 Spring 框架中,@Transactional 注解是实现声明式事务的关键。通过 @Transactional 注解,可以指定事务的传播行为、隔离级别、读写控制等属性。 首先,@Transactional 注解支持 9 个属性的设置,常用的三个属性...
2. 默认回滚机制:Spring 基于注解的声明式事物 @Transactional 默认情况下只会对运行期异常(java.lang.RuntimeException 及其子类)和 Error 进行回滚。 3. 数据库引擎支持:数据库引擎要支持事务,使用 InnoDB。 ...
浅谈Spring中@Transactional事务回滚及示例 @Transactional是Spring Framework中的一种事务管理机制,用于管理数据库事务。它可以使得数据库操作更加安全和可靠。本文将详细介绍@Transactional的使用场景、checked...
在Spring框架中,我们主要依赖`@Transactional`注解来声明事务边界。当一个方法被这个注解标记时,Spring会自动管理事务的开始、提交或回滚。如果方法中发生任何未捕获的异常,事务将被回滚,确保数据的一致性。例如...
2. **开启注解驱动的事务管理**:接下来,我们需要启用`@Transactional`注解,让Spring能够识别并处理标记了该注解的方法。这通过`<tx:annotation-driven>`标签完成: ```xml ``` 这行配置告诉Spring容器,...
- Spring 3.0引入了基于Java的配置,事务管理可以通过`@EnableTransactionManagement`注解开启,然后在配置类中使用`@Transactional`注解进行方法级别的事务配置,或者使用`@Configuration`和`@Bean`定义事务管理器...
源码分析中,我们可以看到Spring如何在运行时解析`@Transactional`注解,如何创建和维护事务,以及如何处理异常以决定事务是否需要回滚。例如,当出现未检查异常(继承自`RuntimeException`的异常)时,Spring会默认...
综上所述,Spring Boot的数据库事务控制是通过Spring框架的声明式事务管理实现的,通过@Transactional注解简化了事务管理。开发者需要理解事务的基本概念、Spring Boot中的事务配置以及事务的管理策略,以便在实际...
总结起来,Spring的注解事务控制为开发带来了便利,它使我们能够在不直接处理底层事务API的情况下,轻松地管理事务。结合Spring MVC和Hibernate,我们可以构建出高效、健壮的数据访问层,确保数据操作的正确性和可靠...
可以研究Spring的TransactionInterceptor拦截器是如何根据@Transactional注解来决定事务的开始、提交或回滚的,以及PlatformTransactionManager的实现类如DataSourceTransactionManager如何与数据库的事务进行交互。...
在Java配置类中,我们可以使用`@EnableTransactionManagement`注解开启事务管理,并使用`@Transactional`注解标记需要事务的方法。 ```java @Configuration @EnableTransactionManagement public class AppConfig {...
Spring提供了几种事务通知类型,如`@Transactional`注解、`tx:advice`元素等。在XML配置中,我们可以使用`<tx:advice>`元素来定义一个事务通知: ```xml *" propagation="REQUIRED"/> ``` 这里,`*`表示...
在Spring中,可以通过`@Transactional`注解的`isolation`属性来设置隔离级别。 4. **持久性(Durability)**:一旦事务提交,其对数据库的更改就应永久保存,即使系统崩溃也应能恢复。在Spring中,通过`...
2. **声明式事务管理**:这是Spring最常用的方式,通过在配置文件或者使用`@Transactional`注解来定义事务边界,使得事务管理与业务逻辑分离,降低了代码的耦合度。`@Transactional`注解可以应用于方法级别,表示该...
在SSM框架中,Spring提供了声明式事务管理,主要通过@Transactional注解实现。这个注解可以放在服务层的方法上,表明该方法需要在一个数据库事务中执行。Spring会自动处理事务的开始、提交、回滚等操作。如果方法...
如果方法执行过程中抛出未检查异常(继承自RuntimeException的异常)或在@Transactional注解中指定的检查异常,Spring将自动回滚事务;反之,如果正常执行,事务将在方法结束时提交。 四、事务传播行为 事务传播...
请注意,虽然这个锁机制可以提高并发控制的可靠性,但它并不能替代数据库的事务管理。如果需要严格的ACID特性,还需要结合数据库事务一起使用。 在Spring Boot项目中,`spring-boot-distributed-redisson-master`这...
例如,在描述中提到的UserService,如果该类是Spring管理的bean,那么在UserService的方法上添加@Transactional注解,就能开启事务。 Hibernate作为ORM框架,使得Java程序可以直接操作对象,而无需关心底层SQL语句...