Springboot+Neo4j+Mysql事务配置(二)

本篇文章我们继续讨论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
    }

这样整个事务提交就OK了,是不是很简单图片

有疑问请点赞和留言哈图片,我会及时回复。

- 本期完 -

为方便看最新内容,记得关注哦!

Springboot+Neo4j+Mysql事务配置(二)_第1张图片

你可能感兴趣的:(Springboot+Neo4j+Mysql事务配置(二))