我会尝试创建一个自定义
PlatformTransactionManager,将其调用委派给当前客户的正确交易管理器。为此,它必须能够从某个地方(例如,从
ThreadLocal变量中)获取当前客户。像这样:
public class CustomerAwareTransactionManager implements PlatformTransactionManager { // Tx managers beans and their names @Autowired private Map<String, PlatformTransactionManager> txManagerMap; private PlatformTransactionManager getCurrentManager() { // CustomerHolder gets the customer from a ThreadLocal variable // something like SecurityContextHolder // It should be set just once for a request and removed at the end // of each request (to prevent memory leaks) String currentIdentifier = CustomerHolder.getCustomer().get().name; for (String managerName : txManagerMap.keySet()) { if (managerName.equals("transactionManager" + currentIdentifier)) { return txManagerMap.get(managerName); } } throw new IllegalStateException("No tx manager for id " + currentIdentifier); } @Override public commit(TransactionStatus status) { this.getCurrentManager().commit(status); } @Override public getTransaction(TransactionDefinition definition) { this.getCurrentManager().getTransaction(definition); } @Override public rollback(TransactionStatus status) { this.getCurrentManager().commit(status); }}在中,
DataSourceConfiguration我用以下代码片段替换了主事务管理器bean:
@Bean@Primarypublic PlatformTransactionManager transactionManager(){ return new CustomerAwareTransactionManager();}而且我在CustomerHolder中创建了一个ThreadLocal变量来存储当前的Customer:
public class CustomerHolder{ private static ThreadLocal<Customer> customer= new ThreadLocal<Customer>();public static ThreadLocal<Customer> getCustomer() { return customer;}public static void setCustomer(ThreadLocal<Customer> customer) { CustomerHolder.customer= customer;}}在webservice方法的开头,即调用我们服务的create方法,我将当前客户存储在CustomerHolder中,而在同一方法的结尾,我删除了当前客户,以避免内存泄漏。
然后,请勿使用的
transactionManager属性
@Transactional并将其命名为该自定义交易管理器,
transactionManager以使其成为默认交易管理器。



