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

Sey*_*ran 15 java spring transactions

  1. 我们有基础通用管理器,由所有管理员继承.基本管理器使用@Transactional注释进行注释.

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


}
Run Code Online (Sandbox Code Playgroud)
@Service
class UserManagerImpl
        extends GenericManagerImpl<IUserDao, User, Long>
        implements IUserManager {

// Everything is OK. User is managed by txManager1

}
Run Code Online (Sandbox Code Playgroud)
@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);
    }
}
Run Code Online (Sandbox Code Playgroud)

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

可能吗?

Sea*_*oyd 12

可以创建自己的注释作为快捷方式@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 {
}  
Run Code Online (Sandbox Code Playgroud)

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

public class TransactionalService {

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

    @AccountTx
    public void doSomething() { ... }
  }
Run Code Online (Sandbox Code Playgroud)


Boz*_*zho 3

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

@Service
@Transactional(readOnly = false, value="txManager2") 
class BillingManagerImpl ....
Run Code Online (Sandbox Code Playgroud)