关于多数据源的事务控制
@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 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(8)
readme注释提到过,虽然不是分布式事务,第4点,没有误导
嗯,是的,和大家想的差不多,之前有测试xa的方式,性能差距较大,但我想也存在存在同样的问题,如果两次预提交都是成功的,但提交的协调者出现问题同样会有问题,可以看看这个 https://segmentfault.com/a/1190000005718940 ,和上面一样只有数据库环境问题才会出现两次有差异的结果,如果认为数据库环境是极其稳定可靠的,嵌套的事务用于避免代码异常情况已经能满足大部分场景,当然你也可以实现xa,欢迎参与开源
理论上也不行啊,除非模式是像xa协议那样,有两段提交,要不然你不知道另一个事务是否会错误。
分布式事务从来都是大难题。一般都是想办法避开,不然实现太麻烦,性能也难以保障。
文档里说明的是多数据源和嵌套事务,没有说分布式事务,没有误导
回复
嗯,我理解错了,看到多数据源事物的实现以为实现了分布式事务的控制。
回复:
@cccyb 可以找一些数据库中间件 来实现 基于消息确认的事务 但也需要协调的消息的稳定支撑 或多或少感觉没有完美的
如果没有真正实现多数据源的事务控制,希望作者能在文档中标注说明下,以免误导使用者。。