本篇文章我们继续讨论neo4j与mysql多数据源时,批量事务的提交。就是说我一个提交结果里既有mysql更新,又有neo4j更新,这个时候的事务该怎么办呢?有人会说加两个事务不就行了,答案是当然不行的,因为@Transactional注解不支持多个事务管理器,默认使用transactionManager,需要实现@Transactional管理mysql事务。我们要做的就是把这两个事务合并成一个事务提交就OK了。
那我们先自定义一个注解,表示这两个事务的合集
@Target({ElementType.METHOD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface MultiTransaction {
//这里可以自定义参数
}
然后我们在配置文件里加上如下代码
@Aspect
@Configuration
@EnableTransactionManagement
@Slf4j
public class Neo4jConfig {
/**
* 定义neo4j事务
*
* @param sessionFactory
* @return
*/
@Bean("neo4jTransactionManager")
public Neo4jTransactionManager neo4jTransactionManager(SessionFactory sessionFactory) {
return new Neo4jTransactionManager(sessionFactory);
}
/**
* 定义mysql 事务
*
* @param emf
* @return
*/
@Bean("transactionManager")
public JpaTransactionManager jpaTransactionManager(EntityManagerFactory emf) {
return new JpaTransactionManager(emf);
}
@Autowired
@Qualifier("neo4jTransactionManager")
Neo4jTransactionManager neo4jTransactionManager;
@Autowired
@Qualifier("transactionManager")
JpaTransactionManager jpaTransactionManager;
/**
* neo4j和mysql混合事务
*
* @param proceedingJoinPoint
* @return
*/
@Around("@annotation(MultiTransaction)")
public Object multiTransaction(ProceedingJoinPoint proceedingJoinPoint) {
TransactionStatus neo4jTransactionStatus = neo4jTransactionManager.getTransaction(new DefaultTransactionDefinition());
TransactionStatus jpaTransactionStatus = jpaTransactionManager.getTransaction(new DefaultTransactionDefinition());
try {
Object obj = proceedingJoinPoint.proceed();
jpaTransactionManager.commit(jpaTransactionStatus);
neo4jTransactionManager.commit(neo4jTransactionStatus);
return obj;
} catch (Throwable throwable) {
jpaTransactionManager.rollback(jpaTransactionStatus);
neo4jTransactionManager.rollback(neo4jTransactionStatus);
log.error("multiTransaction fail:{}", throwable);
throw new RuntimeException(throwable);
}
}
}
最后来看看我们在service层的使用
@Override
@MultiTransaction
public void updateCompanyEntry(CompanyEntryCondition companyEntryCondition) throws Exception {
//更新 mysql
//更新 neo4j
}
- 本期完 -
为方便看最新内容,记得关注哦!