从一个错误谈谈事务管理

分布式事务管理:非XA数据源挑战与解决方案
本文从一个错误出发,探讨了在分布式事务中使用非XA数据源可能遇到的问题。WebSphere和WebLogic提供了不同的解决方案,如WebLogic的模拟两阶段提交和WebSphere的last participant in策略。在配置数据源时,不一致的引用路径可能导致视为不同数据源,影响事务管理。建议优先使用本地事务,若需分布式事务,尽量选择XA驱动。对于LLR、EPC和LPS等技术,虽然可用但存在安全隐患,应当谨慎使用。

最近在产品中发现了一个错误,和分布式事务相关,仔细梳理了一下,还发现不少值得深究的东西,下面就分享给大家。

错误堆栈信息比较长,只摘出关键的一段:

[2/28/12 0:57:28:195 MST] 00000016 SystemErr     R Caused by: javax.resource.ResourceException: enlist: caught Exception
[2/28/12 0:57:28:195 MST] 00000016 SystemErr     R 	at com.ibm.ejs.j2c.LocalTransactionWrapper.enlist(LocalTransactionWrapper.java:696)
[2/28/12 0:57:28:195 MST] 00000016 SystemErr     R 	at com.ibm.ejs.j2c.ConnectionManager.lazyEnlist(ConnectionManager.java:2186)
[2/28/12 0:57:28:195 MST] 00000016 SystemErr     R 	at com.ibm.ws.rsadapter.spi.WSRdbManagedConnectionImpl.lazyEnlist(WSRdbManagedConnectionImpl.java:2569)
[2/28/12 0:57:28:195 MST] 00000016 SystemErr     R 	at com.ibm.ws.rsadapter.jdbc.WSJdbcConnection.beginTransactionIfNecessary(WSJdbcConnection.java:714)
[2/28/12 0:57:28:195 MST] 00000016 SystemErr     R 	... 127 more
[2/28/12 0:57:28:195 MST] 00000016 SystemErr     R Caused by: com.ibm.ws.Transaction.IllegalResourceIn2PCTransactionException: Ill
<think>我们正在讨论SpringAOP的概念和通知类型。根据用户的问题,用户希望了解SpringAOP的原理以及通知类型的含义。结合站内引用,我们可以这样组织回答:1.**SpringAOP概念**:参考引用[2],AOP(面向切面编程)是OOP的有效补充,它允许将系统性的编程工作(如权限管理、事务管理、日志记录)独立出来,然后通过切面切入系统,实现关注点分离。2.**SpringAOP原理**:参考引用[1]和引用[3],SpringAOP通过代理模式实现,主要有两种代理方式:JDK动态代理(针对接口)和CGLIB代理(针对类)。它通过动态代理和字节码增强技术,在不修改目标类代码的前提下,实现横切逻辑。3.**通知类型**:在之前的回答中已经详细介绍了五种通知类型(前置、后置、异常、最终、环绕),这里可以简要总结,并强调它们与AOP核心概念(如切面、连接点、切入点等)的关系。因此,我们可以将回答分为两部分:-第一部分:SpringAOP概念和原理-第二部分:通知类型介绍(简洁回顾)同时,根据系统指令,我们需要在回答中自然地添加引用标识,并使用正确的中文和LaTeX格式(但这里没有数学公式,所以主要注意引用)。另外,生成相关问题。</think>### Spring AOP 原理与通知类型详解 #### 一、Spring AOP 核心概念 Spring AOP(面向切面编程)是OOP(面向对象编程)的补充,核心思想是将**横切关注点**(如日志、事务、权限)从业务逻辑中分离,实现模块化。其原理基于**代理模式**: 1. **代理机制** - **JDK动态代理**:针对实现接口的类,运行时生成代理对象[^1] - **CGLIB代理**:针对无接口的类,通过字节码增强生成子类代理[^3] ```java // 示例:JDK动态代理核心逻辑 public Object invoke(Object proxy, Method method, Object[] args) { beforeAdvice(); // 前置通知 Object result = method.invoke(target, args); // 执行原方法 afterAdvice(result); // 后置通知 return result; } ``` 2. **核心术语** | 术语 | 作用 | |-------------|-------------------------------| | **Aspect** | 横切逻辑模块(如日志切面)[^3] | | **JoinPoint** | 程序执行点(如方法调用)[^3] | | **Pointcut** | 定义哪些连接点需要拦截[^3] | | **Weaving** | 将切面织入目标对象的过程[^3] | #### 二、通知类型(Advice)详解 通知定义了**切面逻辑的执行时机**,共5种类型: 1. **前置通知(@Before)** - 目标方法执行**前**触发 - 场景:参数校验、权限检查 ```java @Before("execution(* com.service.*.*(..))") public void logBefore(JoinPoint jp) { System.out.println("准备执行: " + jp.getSignature()); } ``` 2. **后置通知(@AfterReturning)** - 方法**正常返回后**触发(无异常) - 场景:记录返回值、数据处理 ```java @AfterReturning(pointcut="...", returning="result") public void logResult(Object result) { System.out.println("返回结果: " + result); } ``` 3. **异常通知(@AfterThrowing)** - 方法**抛出异常时**触发 - 场景:异常日志、错误告警 ```java @AfterThrowing(pointcut="...", throwing="ex") public void handleException(Exception ex) { System.err.println("异常信息: " + ex.getMessage()); } ``` 4. **最终通知(@After)** - 方法执行**结束后必触发**(无论是否异常) - 场景:资源清理(如关闭连接) ```java @After("execution(* com.service.*.*(..))") public void releaseResource() { System.out.println("释放资源..."); } ``` 5. **环绕通知(@Around)** - **最强大的通知**,可控制方法执行全过程 - 场景:性能监控、事务管理 ```java @Around("execution(* com.service.*.*(..))") public Object aroundAdvice(ProceedingJoinPoint pjp) throws Throwable { long start = System.currentTimeMillis(); Object result = pjp.proceed(); // 执行原方法 long time = System.currentTimeMillis() - start; System.out.println("方法耗时: " + time + "ms"); return result; } ``` #### 三、AOP工作流程 1. 定义切面(`@Aspect`)和切入点(`@Pointcut`) 2. Spring容器启动时,通过**代理工厂**创建目标对象的代理 3. 当调用代理对象方法时,根据切入点匹配决定是否织入通知 4. 执行通知链,最终调用目标方法(环绕通知可干预此过程)[^1][^3] > **关键优势**:业务代码保持纯净,横切逻辑集中管理,提升可维护性[^2]。例如事务管理只需一个`@Transactional`注解,背后由环绕通知实现完整的事务控制。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值