【问题标题】:Multiple transaction managers with @Transactional annotation带有@Transactional 注释的多个事务管理器
【发布时间】:2011-03-20 23:23:06
【问题描述】:
  1. 我们有基本的通用管理器,它 由所有管理者继承。根据 经理被注释 @Transactional 注释。

  2. 有 2 组事务性 服务:

    • x.y.service1.* - 必须由 transactionManager1 管理
    • x.y.service2.* - 必须由 transactionManager2 管理

如何在不覆盖所有事务方法并指定事务管理器的情况下配置事务?

@Transactional(readOnly = true)
public abstract class GenericManagerImpl<D extends IGenericDao, T extends BaseObject, PK extends Serializable>
        implements IGenericManager<T, PK> {

    protected D dao;

    @Autowired
    public void setDao(D dao) {
        this.dao = dao;
    }


    @Transactional(readOnly = false)
    public void save(T object) {
        dao.save(object);
    }

    @Transactional(readOnly = false)
    public void remove(T object) {
        dao.remove(object);
    }


}

@Service
class UserManagerImpl
        extends GenericManagerImpl<IUserDao, User, Long>
        implements IUserManager {

// Everything is OK. User is managed by txManager1

}

@Service
class BillingManagerImpl
        extends GenericManagerImpl<IBillingDao, Billing, Long>
        implements IBillingManager {

    @Override
    @Transactional(readOnly = false, value="txManager2") // <--have to override method only to specify txManager
    public void save(final Billing billing ) {
        super.save(billing);
    }

    @Override
    @Transactional(readOnly = false, value="txManager2") // <--have to override method only to specify txManager
    public void remove(final Billing billing ) {
        super.remove(billing);
    }
}

很可能我需要将 aop 与 @Transactional 注释结合起来。
其实,我想要的是:
1) 能够使用@Transactional 注释配置事务(只读标志、传播、隔离等)。
2) 定义策略以在我的类之外选择事务管理器(例如,使用 AOP)
x.y.service1.* -> 使用 txManager1
x.y.service2.* -> 使用 txManager2

有可能吗?

【问题讨论】:

    标签: java spring transactions


    【解决方案1】:

    create your own annotations 可以作为@Transactional(value="tx1") 的快捷方式。 (这些可以在类或方法级别使用)

    来自参考文档:

    例如定义如下注解

    @Target({ElementType.METHOD, ElementType.TYPE})
    @Retention(RetentionPolicy.RUNTIME)
    @Transactional("order")
    public @interface OrderTx {
    }
    
    @Target({ElementType.METHOD, ElementType.TYPE})
    @Retention(RetentionPolicy.RUNTIME)
    @Transactional("account")
    public @interface AccountTx {
    }  
    

    允许我们将上一节中的示例编写为

    public class TransactionalService {
    
        @OrderTx
        public void setSomething(String name) { ... }
    
        @AccountTx
        public void doSomething() { ... }
      }
    

    【讨论】:

    • 是的,我知道我可以使用元注释。但这只是简化配置。我仍然需要覆盖方法并使用 @OrderTx 之类的注释对其进行注释
    • @BigDong 通过 Spring 4.2 引入的@AliasFor 机制
    【解决方案2】:

    我猜你可以在类级别定义@Transactional

    @Service
    @Transactional(readOnly = false, value="txManager2") 
    class BillingManagerImpl ....
    

    【讨论】:

    • 我在基本管理器中只读而不是只读方法。我在这里有 2 个选项:1) 对每个非只读方法都有类级别注释 @Transactional(readOnly = true) 和方法级别注释 @Transactional(readOnly = false) 2) 有类级别注释 @Transactional(readOnly = false) 和每个只读方法的方法级别注释 @Transactional(readOnly = true) 在任何情况下,我都需要为必须由 txManager2 管理的服务覆盖方法级别 @transactional 注释
    猜你喜欢
    • 2023-02-16
    • 1970-01-01
    • 2011-12-24
    • 2019-01-09
    • 2014-02-14
    • 2019-11-02
    • 1970-01-01
    • 2013-09-22
    • 2019-07-02
    相关资源
    最近更新 更多