java - 如何配置要使用的事务管理器而不必覆盖所有@Transactional 方法

标签 java spring transactions

长期听众第一次来电。

我们有一个包含通用事务逻辑的 AbstractService.java 类。并非此类中的所有方法都是事务性的。曾经是,用 spring 的 @Transactional 注释进行注释。

现在每个 AbstractService 的实现都可能有不同的事务管理器。这可以通过覆盖抽象类中的方法并提供不同的 tx 管理器在具体类中进行配置:

@Transactional(value=TRANSACTION_MANAGER)

不可能将事务管理器名称传递给抽象类,因为“注释属性 Transactional.value 的值必须是常量表达式”。

据我所知,配置事务管理器的方法有两种:

  1. 重写具体类中的每个@Transactional 方法只是为了调用 super 方法:

     @Transactional(timeout = 60, value = TRANSACTION_MANAGER)
     @Override
     public String editEntity(Integer id, Integer columnPosition, Object value) {
    return super.editEntity(id, columnPosition, value);
    
  2. 改为在类级别添加 @Transactional 注释。这强制在事务中处理非事务性方法,并且当非事务性方法调用其他事务性方法时,我们最终得到一个嵌套的 tx soup。

还有第三种选择吗?类似于现在已弃用的 Spring 测试 @NotTransactional可以与上面的选项 2 一起使用。

有一个very similar question差不多三年前问了。既然从那时起 Spring 发生了很多事情,我们还有其他选择吗?

自定义注释答案虽然很简洁,但并未解决问题。

我的问题可以总结为:

如何配置事务而不必仅覆盖所有事务方法来指定事务管理器?

最佳答案

我建议您将 AbstractService 重构为三个类:

  • 第一个类是当前的 AbstractService,它的接口(interface)、方法签名等保持与任何现有子类的二进制兼容,但所有实现都已被删除。
  • 第二个类包含所有事务性业务逻辑,因此它使用 @Transactional 注释(在类级别上使用正确的事务管理器)。
  • 第三类包含所有非事务性业务逻辑。

现在,您只需将最后两个类 Autowiring 到重构的 AbstractService 中,它只是将传入的方法调用委托(delegate)给已移至新创建的类之一的实现。

关于java - 如何配置要使用的事务管理器而不必覆盖所有@Transactional 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14757486/

相关文章:

java - 将 JTextPane 添加到 BorderLayout.SOUTH 会导致 JScrollPane 滚动

java - 运行导入的入门项目访问facebook数据出现NullPointerException

c# - asp.net中的事务和存储过程有区别吗

java - Ehcache web CacheManager.replaceCacheWithDecoratedCache 抛出 NPE

java - 如何使用 owlapi 从加载的本体中获取所有类?

java - Spring原型(prototype)bean是否需要手动销毁?

javascript - 我们可以通过电子商务交易发送自定义维度(用户范围)吗?

java - 使用可序列化隔离的同一事务的 2 个实例出现死锁

java - 生成带有图像的 Excel 工作表

java - Spring登录系统