一、非public修饰的方法
@Transactional注解只能在在public修饰的方法下使用。
/**
* 私有方法上的注解,不生效(因私有方法Spring扫描不到该方法,所以无法生成代理)
*/
@Transactional
private boolean test() {
//test code
}
Java
非public修饰的方法事务失效的原因主要有以下几点:
1. 访问权限限制:非public修饰的方法可能无法被外部调用,而事务通常需要在外部调用的方法中开启。如果方法无法被外部调用,事务就无法生效。
2. 事务管理器配置问题:事务管理器可能没有正确配置非public方法的事务传播行为。事务传播行为定义了事务在方法调用链中的传播方式,包括事务的开启、提交和回滚等操作。如果事务管理器没有正确配置非public方法的传播行为,事务可能无法正常生效。
3. 代理机制问题:事务通常是通过代理机制来实现的,代理对象会拦截方法调用,并在方法调用前后进行事务管理。但是非public方法可能无法被代理对象拦截,导致事务无法生效。
4. 异常处理问题:事务通常依赖于异常的抛出和捕获来进行事务的回滚或提交。但是非public方法可能无法抛出或捕获异常,导致事务无法正确处理异常情况。
总之,非public修饰的方法事务失效的原因主要是因为访问权限限制、事务管理器配置问题、代理机制问题和异常处理问题等。为了确保事务的生效,应该正确配置事务管理器,并确保需要事务支持的方法具有正确的访问权限。
二、类内部访问
例:类内部非直接访问带注解标记的方法 B,而是通过类普通方法 A,然后由 A 调用 B。
@Service
public class Demo {
public void A() {
this.B();
}
@Transactional
public void B() {
......
}
}
Java
在该Service类中使用AopContext.currentProxy()获取代理对象
((ServiceA)AopContext.currentProxy()).doSave(user);Plain Text
类内部访问导致事务失效的原因有以下几点:
1. 事务控制的范围不正确:事务的开始和结束应该在整个业务逻辑的最外层&