老哥们,周二好。问一个跨库保证一致性的问题

2019-11-12 15:53:30 +08:00
 ayonel

业务背景: 有一份数据,需要双写到两份存储( Mysql、Neo4j )

项目基于 springboot.我已经配置了 mysql 数据源的事务管理器,neo4j 没有配置。在不使用分布式事务的前提下,以下这种做法能否保证两份数据的一致性:

@Transactional
public void doService() {
	// 第一步,插 mysql
	insertMysql();
    // 第二步,插 neo4j
    insertNeo4j();
}

思路:

  1. 如果插 mysql 出现异常,此时 mysql 事务直接回滚,neo4j 还没来得及插入。所以最终表现是:两个引擎数据都没写入,保持一致。
  2. 如果插入 neo4j 出现异常,此时 mysql 事务也会回滚。而 neo4j 由于插入失败,也没有数据。所以最终表现是:两个引擎数据都没写入,保持一致。

看起来,这样简单的做法能保证一致性,老哥们能指出这种做法有啥坑吗?( PS:假设 mysql、neo4j 都是一条操作语句)

5707 次点击
所在节点    Java
45 条回复
codeyung
2019-11-12 21:30:19 +08:00
不是核心业务就 mq 异步 或这半异步 自己开个线程池写顺便发个 mq 写 做个防重 核心你就要做最终一致 用代码或者组件写你核心逻辑的 然后做业务逻辑的验证 Confirm 和 如果业务失败的 Cancel 一半情况就是自己写验证 看看 MQ 事务 类似的道理
codeyung
2019-11-12 21:32:51 +08:00
强一致性能 emm
ayonel
2019-11-13 11:14:29 +08:00
@codeyung 感谢解惑,大概理解了
iIli1iIliIllLiL
2019-11-13 14:49:12 +08:00
@ayonel 会,只要你是双写,就会有这个问题,相同的场景还有缓存数据库双写一致性的 wen ti,简单来说你这个就是分布式事务的问题。
shinyzhu
2022-02-07 16:15:32 +08:00
Neo4j 支持 ACID ,而 MySQL 是另外一个数据库产品。所以?为什么要这样一致?

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/618835

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX