복붙노트

[SPRING] @Transactional 주석이있는 여러 트랜잭션 관리자

SPRING

@Transactional 주석이있는 여러 트랜잭션 관리자

모든 트랜잭션 방식을 오버라이드하고 트랜잭션 관리자를 지정하기 위해 어떻게 트랜잭션을 구성 할 수 있습니까?

@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 사용

가능한가?

해결법

  1. ==============================

    1.@Transactional (value = "tx1")에 대한 단축키로 자신 만의 주석을 만들 수 있습니다. (클래스 또는 메서드 수준에서 사용할 수 있습니다)

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

    2.클래스 수준에서 @Transactional을 정의 할 수 있다고 생각합니다.

    클래스 수준에서 @Transactional을 정의 할 수 있다고 생각합니다.

    @Service
    @Transactional(readOnly = false, value="txManager2") 
    class BillingManagerImpl ....
    
  3. from https://stackoverflow.com/questions/3333133/multiple-transaction-managers-with-transactional-annotation by cc-by-sa and MIT license