2011-05-04 50 views
1

我有两个事务管理器,很好奇,如果有一些可能性得到已被使用的。春天 - 得到使用TransactionManager

更具体的,怎么可能underlyingMethod(..)找出使用transactionManager的(而不发送额外的参数 “transactionManagerName/REF”):

@Transactional("transactionManager1") 
public void transactionFromFirstTM() { 
    someClass.underlyingMethod() 
} 


@Transactional("transactionManager2") 
public void transactionFromSecondTM() { 
    someClass.underlyingMethod() 
} 


好,我已经使用这个从实际的事务管理器获得Hibernate的Session:

protected Session getSession() { 
    Map<Object, Object> resourceMap = TransactionSynchronizationManager.getResourceMap(); 

    Session session = null; 
    for (Object value : resourceMap.values()) { 
     if (value instanceof SessionHolder) { 
      session = ((SessionHolder) value).getSession(); 
      break; 
     } 
    } 

    return session; 
} 
+0

你为什么需要它? – Bozho 2011-05-04 11:40:10

+0

最初的计划是有两个数据库,并且通过在Transactional注释中定义链接的transactionManager名称来简单地选择正确的数据库(对于两个数据库,代码行为应该是相同的) – 2011-05-04 11:48:48

回答

2

我不认为你可以,但你不应该做的事务管理器什么。有关当前交易的一些操作可在TransactionSynchronizationManager

另一个有用的类是TransactionAspectUtils。但并不是说这两个都是内部使用的,你不应该在代码中的许多地方依赖它们。