当前位置: 首页 > wzjs >正文

怎样做网站测试百度天眼查公司

怎样做网站测试,百度天眼查公司,网站访问量来源,网页在线代理上网Spring Transactional 自调用问题深度解析 问题本质:自调用事务失效 当类内部的方法A调用同一个类的另一个带有Transactional注解的方法B时,事务注解不会生效。这是因为Spring的事务管理是基于AOP代理实现的,而自调用会绕过代理机制。 原理…

Spring @Transactional 自调用问题深度解析

问题本质:自调用事务失效

当类内部的方法A调用同一个类的另一个带有@Transactional注解的方法B时,事务注解不会生效。这是因为Spring的事务管理是基于AOP代理实现的,而自调用会绕过代理机制。

原理分析

1. Spring事务实现机制

Spring事务是通过动态代理实现的,有两种方式:

  • JDK动态代理:基于接口
  • CGLIB代理:基于类继承
// 原始调用流程(期望的事务流程)
caller → 代理对象 → 目标对象.methodB()// 自调用时的实际流程
caller → 目标对象.methodA() → 目标对象.methodB() [绕过代理]

2. 自调用问题示例

@Service
public class OrderService {public void placeOrder(Order order) {// 自调用导致事务失效validateOrder(order);// 其他业务逻辑...}@Transactionalpublic void validateOrder(Order order) {// 数据库验证操作...}
}

解决方案

方案1:注入自身代理(推荐)

@Service
public class OrderService {@Autowiredprivate OrderService selfProxy; // 注入代理对象public void placeOrder(Order order) {selfProxy.validateOrder(order); // 通过代理调用}@Transactionalpublic void validateOrder(Order order) {// 事务生效}
}

方案2:重构代码结构

@Service
@RequiredArgsConstructor
public class OrderService {private final OrderValidator orderValidator;public void placeOrder(Order order) {orderValidator.validate(order);}
}@Service
class OrderValidator {@Transactionalpublic void validate(Order order) {// 事务操作}
}

方案3:使用AspectJ模式(编译时织入)

# application.properties
spring.aop.proxy-target-class=true
spring.aop.auto=false

技术深度:Spring事务代理机制

代理创建过程

  1. 容器启动时创建原始Bean
  2. 通过AbstractAutoProxyCreator创建代理
  3. @Transactional方法添加拦截器

事务拦截器调用栈

TransactionInterceptor.invoke()
→ MethodInvocation.proceed()
→ ReflectiveMethodInvocation.proceed()
→ 最终调用目标方法

生产环境最佳实践

  1. 统一事务边界

    @Service
    @Transactional // 类级别注解
    public class OrderService {public void placeOrder() {// 所有public方法都默认有事务}
    }
    
  2. 事务监控

    @Aspect
    @Component
    public class TransactionMonitor {@Around("@annotation(transactional)")public Object monitor(ProceedingJoinPoint pjp, Transactional transactional) throws Throwable {// 记录事务开始/结束}
    }
    
  3. 异常处理

    @Transactional(rollbackFor = {BusinessException.class, TechnicalException.class})
    public void process() {// 明确指定回滚异常类型
    }
    

常见误区

  1. 私有方法加注解

    @Transactional // 无效!
    private void internalMethod() {}
    
  2. final方法加注解

    @Transactional // CGLIB代理下无效!
    public final void finalMethod() {}
    
  3. 同类非事务方法调用事务方法

    public void methodA() {methodB(); // 事务失效
    }@Transactional
    public void methodB() {}
    

性能考量

  1. 代理创建会增加启动时间
  2. 每个事务方法调用都有拦截开销
  3. 长事务会占用数据库连接
http://www.dtcms.com/wzjs/40244.html

相关文章:

  • 重庆市建设政务中心网站2345手机浏览器
  • 网站开发设计心得百度关键词购买
  • 太原网站建设-中国互联推广公司简介
  • 上饶网站网站建设域名权重查询工具
  • 做网站的图片传进去很模糊百度页面
  • 湖南住房和建设厅网站代运营公司可靠吗
  • 网站开发的技术支撑 经验能力十大搜索引擎入口
  • 哈尔滨网站建设2017商品热搜词排行榜
  • 国内网站建设联系电话网络运营工作内容
  • 网站设计制作哪些seo点击排名
  • php 调用其他网站杭州百度seo
  • 沈阳公司做网站郑州seo全网营销
  • wordpress 中文 相册插件下载百度词条优化工作
  • 北京金企鹅网站建设方案百度搜索
  • 毕节做网站吴江网站制作
  • 做课件的网站有哪些网络营销考试题目及答案2022
  • 做网站的价位模板建站哪里有
  • 濮阳门户网站开发网游推广员
  • 长沙制作手机网站网站设计的流程
  • 做关键词搜索的网站上海优化外包
  • 内容不相关的网站做301重定向百度seo搜搜
  • 网站开发维护报价单长春网络优化哪个公司在做
  • 织梦网站如何做地区分站代写1000字多少钱
  • 重庆有专业做网站的吗微信营销的方法有哪些
  • 许昌购物网站开发设计seo推广培训
  • 建设金融行业网站百度人工服务热线电话
  • 天进品牌营销策划公司seo网站设计工具
  • 百度收录网站要多宁德市区哪里好玩
  • 315网站专题怎么做什么是网络营销战略
  • 电梯企业网站制作北京网络营销推广培训哪家好