EOS Low-Code Platform 8 EOS Low-Code Platform 8
产品简介
学习指南
更新说明
安装与集成
上线指南
初见EOS
低代码开发手册
专业代码开发手册
智能体开发手册
专题场景实战
公共服务框架
应用运行治理
运维指南
  • 使⽤@Service注解时,如何避免被EOS拦截事务管理
  • 1.场景介绍
  • 2.实现方法
  • 使用@DisableTransactional注解
  • 使用方法TransactionUtil.disableTransactional(Callable call)

# 使⽤@Service注解时,如何避免被EOS拦截事务管理

EOS项目针对所有添加了@Service注解的实现类提供了一致的事务管理。

# 1.场景介绍

本地高开应用,在@Service注解实现类下实现功能代码,在程序执行异常时不希望事务回滚。

# 2.实现方法

# 使用@DisableTransactional注解

在@Service实现类上添加@DisableTransactional注解,即可让该实现类不受EOS事务控制。或在该类中的某个方法上添加注解@DisableTransactional,即可让该方法不受事务控制。

实现方法

# 使用方法TransactionUtil.disableTransactional(Callable call)

TransactionUtil.disableTransactional() 方法提供了一种在代码级别临时禁用事务管理的能力,特别适合在某个业务逻辑中临时需要不受事务控制的场景。

# 方法签名

public static <T> T disableTransactional(Callable<T> call)

# 参数说明

  • call: Callable<T> 类型,表示需要执行的业务逻辑代码块
  • 返回值: 泛型 T,与 Callable.call() 方法的返回值类型一致

# 使用场景

  1. 临时禁用事务: 在某个受 @Service 注解事务控制的方法中,临时执行某段不需要事务管理的代码
  2. 选择性事务控制: 在同一个方法中,一部分代码需要事务控制,另一部分不需要
  3. 集成外部系统: 调用外部系统接口时,可能需要禁用 EOS 事务管理

# 代码示例

import com.primeton.ext.common.service.TransactionUtil;

public class MyBusinessService {
    /**
     * 示例1: 基本使用
     */
    public void basicUsage() {
        TransactionUtil.disableTransactional(() -> {
            // 这里面的代码不会受到EOS事务管理
            // 即使抛出异常,也不会回滚外部事务
            externalApiCall();
            dataOperationWithoutTransaction();
            return null;
        });
    }

    /**
     * 示例2: 有返回值的情况
     */
    public String returnValueExample() {
        String result = TransactionUtil.disableTransactional(() -> {
            // 执行业务逻辑并返回结果
            return externalService.fetchData();
        });
        return result;
    }
}

# 注意事项

  1. 线程安全: 该方法在当前线程中执行,不影响其他线程的事务状态
  2. 异常处理: 方法内部抛出的异常会被捕获并重新抛出,不会影响外部事务
  3. 性能影响: 相比 @DisableTransactional 注解,该方法会有轻微的性能开销,建议在频繁调用的地方谨慎使用

# 最佳实践

  1. 优先使用注解: 如果整个类或方法都不需要事务,优先使用 @DisableTransactional 注解
  2. 方法使用: 对于临时代码片段,使用 TransactionUtil.disableTransactional() 方法
  3. 代码可读性: 将禁用事务的代码块控制在最小范围内,提高代码可读性
  4. 异常处理: 确保禁用事务部分的异常有适当的处理逻辑

← 低开SDO静态代码导入高开使用 Java代码调用逻辑流 →