Несколько менеджеров транзакций с @Transactional аннотацией

  1. У нас есть основной универсальный менеджер, который наследован всеми менеджерами. Основной менеджер аннотируется @Transactional аннотациями.

  2. Существует 2 группы транзакционных сервисов:

    • x.y.service1.* - должны управляться transactionManager1
    • x.y.service2.* - должны управляться transactionManager2

Как транзакции могут быть настроены без nessesity, чтобы переопределить ВСЕ транзакционные методы и указать менеджер транзакций?

@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) Смочь настроить транзакции (флаг только для чтения, propogation, изоляция и т.д.) с @Transactional аннотацией.
2) определите стратегию выбрать менеджер транзакций за пределами моих классов (использующий AOP, например)
x.y.service1.*-> используют txManager1
x.y.service2.*-> используют txManager2

Действительно ли это возможно?

15
задан Brad Larson 1 January 2014 в 16:03
поделиться

2 ответа

Думаю, вы можете определить @Transactional на уровне классов

@Service
@Transactional(readOnly = false, value="txManager2") 
class BillingManagerImpl ....
3
ответ дан 1 December 2019 в 04:27
поделиться

Существует возможность создавать свои собственные аннотации как ярлыки для @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() { ... }
  }
12
ответ дан 1 December 2019 в 04:27
поделиться
Другие вопросы по тегам:

Похожие вопросы: