关于多数据源的事务控制

风象南 发布于 2016/07/21 20:20
阅读 920
收藏 0

开源之夏第三届火热来袭,高校学生参与赢万元奖金!>>>

@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();
          }
        }
感觉无法做到事务的统一控制,例如第一个数据源正常提交后,第二个数据源提交事务时出现异常时,是不能够回滚第一个数据源的事务的。后经测试也证明确实无法回滚。

加载中
0
风象南
风象南
如果没有真正实现多数据源的事务控制,希望作者能在文档中标注说明下,以免误导使用者。。
Dreampie
Dreampie
回复: @cccyb 可以找一些数据库中间件 来实现 基于消息确认的事务 但也需要协调的消息的稳定支撑 或多或少感觉没有完美的
风象南
风象南
回复 @Dreampie : 嗯,我理解错了,看到多数据源事物的实现以为实现了分布式事务的控制。
Dreampie
Dreampie
文档里说明的是多数据源和嵌套事务,没有说分布式事务,没有误导
0
魔力猫
魔力猫
分布式事务从来都是大难题。一般都是想办法避开,不然实现太麻烦,性能也难以保障。
0
ihuotui
ihuotui

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


0
Dreampie
Dreampie
嗯,是的,和大家想的差不多,之前有测试xa的方式,性能差距较大,但我想也存在存在同样的问题,如果两次预提交都是成功的,但提交的协调者出现问题同样会有问题,可以看看这个 https://segmentfault.com/a/1190000005718940 ,和上面一样只有数据库环境问题才会出现两次有差异的结果,如果认为数据库环境是极其稳定可靠的,嵌套的事务用于避免代码异常情况已经能满足大部分场景,当然你也可以实现xa,欢迎参与开源
0
Dreampie
Dreampie
readme注释提到过,虽然不是分布式事务,第4点,没有误导
OSCHINA
登录后可查看更多优质内容
返回顶部
顶部
返回顶部
顶部