Java 带有@Transactional 注释的多个事务管理器

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/3333133/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-13 22:18:41  来源:igfitidea点击:

Multiple transaction managers with @Transactional annotation

javaspringtransactions

提问by Seyran

  1. We have base generic manager which is inherited by all managers. Base manager is annotated with @Transactional annotations.

  2. There are 2 groups of transactional services:

    • x.y.service1.*- have to be managed by transactionManager1
    • x.y.service2.*- have to be managed by transactionManager2
  1. 我们有由所有管理器继承的基本通用管理器。基本管理器使用@Transactional 注释进行注释。

  2. 有两组交易服务:

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

How can transactions be configured without nessesity to override ALL transactional methods and specify transaction manager?

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

@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);
    }
}


Most probably i need to combine aop with @Transactional annotation.
Actually, what i want is:
1) To be able to configure transactions (read only flag, propogation, isolation etc) with @Transactional annotation.
2) define strategy to choose transaction manager outside of my classes (using AOP, for example)
x.y.service1.* -> use txManager1
x.y.service2.* -> use txManager2

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

Is it possible?

是否可以?

回答by Bozho

I guess you can define @Transactionalat class-level

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

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

回答by Sean Patrick Floyd

There is the possibility to create your own annotationsas shortcuts for @Transactional(value="tx1"). (These can be used at class or method level)

可以创建自己的注释作为@Transactional(value="tx1"). (这些可以在类或方法级别使用)

from the reference documentation:

从参考文档:

For example, defining the following annotations

例如,定义以下注解

@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 {
}  

allows us to write the example from the previous section as

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

public class TransactionalService {

    @OrderTx
    public void setSomething(String name) { ... }

    @AccountTx
    public void doSomething() { ... }
  }