# 使⽤@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()方法的返回值类型一致
# 使用场景
- 临时禁用事务: 在某个受 @Service 注解事务控制的方法中,临时执行某段不需要事务管理的代码
- 选择性事务控制: 在同一个方法中,一部分代码需要事务控制,另一部分不需要
- 集成外部系统: 调用外部系统接口时,可能需要禁用 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;
}
}
# 注意事项
- 线程安全: 该方法在当前线程中执行,不影响其他线程的事务状态
- 异常处理: 方法内部抛出的异常会被捕获并重新抛出,不会影响外部事务
- 性能影响: 相比 @DisableTransactional 注解,该方法会有轻微的性能开销,建议在频繁调用的地方谨慎使用
# 最佳实践
- 优先使用注解: 如果整个类或方法都不需要事务,优先使用
@DisableTransactional注解 - 方法使用: 对于临时代码片段,使用
TransactionUtil.disableTransactional()方法 - 代码可读性: 将禁用事务的代码块控制在最小范围内,提高代码可读性
- 异常处理: 确保禁用事务部分的异常有适当的处理逻辑