关于多数据源的事务控制

发布于 2021-12-03 21:13:46 字数 1177 浏览 895 评论 8

@Dreampie 你好,想跟你请教个问题:

    刚才拜读了下resty的源码,看到关于多数据源事物控制实现的核心是如下的(TransactionAspect类中):

for (int i = 0; i < names.length; i++) {
          dataSourceMeta = Metadata.getDataSourceMeta(names[i]);
          dataSourceMeta.initTransaction(readonlys.length == 1 ? readonlys[0] : readonlys[i], levels.length == 1 ? levels[0] : levels[i]);
          dataSourceMetas.add(dataSourceMeta);
        }
        //执行操作
        result = ih.invoke(proxy, method, args);
        for (DataSourceMeta dsm : dataSourceMetas) {
          dsm.commitTransaction();
        }
      } catch (Throwable t) {
        for (DataSourceMeta dsm : dataSourceMetas) {
          dsm.rollbackTransaction();
        }
        String message = t.getMessage();
        Throwable cause = t.getCause();
        if (message == null) {
          if (cause != null) {
            message = cause.getMessage();
          }
        }
感觉无法做到事务的统一控制,例如第一个数据源正常提交后,第二个数据源提交事务时出现异常时,是不能够回滚第一个数据源的事务的。后经测试也证明确实无法回滚。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(8

坚持沉默 2021-12-04 16:13:22

readme注释提到过,虽然不是分布式事务,第4点,没有误导

苍暮颜 2021-12-04 16:07:20

嗯,是的,和大家想的差不多,之前有测试xa的方式,性能差距较大,但我想也存在存在同样的问题,如果两次预提交都是成功的,但提交的协调者出现问题同样会有问题,可以看看这个 https://segmentfault.com/a/1190000005718940 ,和上面一样只有数据库环境问题才会出现两次有差异的结果,如果认为数据库环境是极其稳定可靠的,嵌套的事务用于避免代码异常情况已经能满足大部分场景,当然你也可以实现xa,欢迎参与开源

虐人心 2021-12-04 15:43:35

理论上也不行啊,除非模式是像xa协议那样,有两段提交,要不然你不知道另一个事务是否会错误。

醉生梦死 2021-12-04 14:58:10

分布式事务从来都是大难题。一般都是想办法避开,不然实现太麻烦,性能也难以保障。

天涯离梦残月幽梦 2021-12-04 14:12:04

文档里说明的是多数据源和嵌套事务,没有说分布式事务,没有误导

笑红尘 2021-12-04 06:45:05

回复
嗯,我理解错了,看到多数据源事物的实现以为实现了分布式事务的控制。

终止放荡 2021-12-04 03:38:50

回复:
@cccyb 可以找一些数据库中间件 来实现 基于消息确认的事务 但也需要协调的消息的稳定支撑 或多或少感觉没有完美的

韬韬不绝 2021-12-03 22:19:29

如果没有真正实现多数据源的事务控制,希望作者能在文档中标注说明下,以免误导使用者。。

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文