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

    }

- 本期完 -

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

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容