具有@Transactional注释的多个事务管理器
-
我们有基础通用管理器,由所有管理员inheritance。 基本管理器使用@Transactional注释进行注释。
-
有两组交易服务:
-
xyservice1.*
– 必须由transactionManager1
管理 -
xyservice2.*
– 必须由transactionManager2
管理
-
如何在没有必要的情况下配置事务来覆盖所有事务方法并指定事务管理器?
@Transactional(readOnly = true) public abstract class GenericManagerImpl implements IGenericManager { 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 implements IUserManager { // Everything is OK. User is managed by txManager1 }
@Service class BillingManagerImpl extends GenericManagerImpl 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)
xyservice1。* – >使用txManager1
xyservice2。* – >使用txManager2
可能吗?
可以创建自己的注释作为@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() { ... } }
我猜你可以在class级定义@Transactional
@Service @Transactional(readOnly = false, value="txManager2") class BillingManagerImpl ....