具有@Transactional批注的多个事务管理器 [英] Multiple transaction managers with @Transactional annotation

查看:905
本文介绍了具有@Transactional批注的多个事务管理器的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

  1. 我们有基本的通用管理器, 由所有经理继承.根据 经理带有注释 @Transactional批注.

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

有2组交易 服务:

  • x.y.service1.*-必须由transactionManager1
  • 管理
  • x.y.service2.*-必须由transactionManager2
  • 管理
  • x.y.service1.* - have to be managed by transactionManager1
  • x.y.service2.* - have to be managed by 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


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

有可能吗?

推荐答案

可以的快捷方式. (这些可以在类或方法级别使用)

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

来自参考文档:

例如,定义以下注释

@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() { ... }
  }

这篇关于具有@Transactional批注的多个事务管理器的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆