【问题标题】:What is the best way to "roll back" changes?“回滚”更改的最佳方法是什么?
【发布时间】:2014-11-24 21:29:50
【问题描述】:

好的,所以我有一个 Spring 应用程序,它接受网络表示并启动虚拟机来表示传入的网络。

它使用低级 API 来启动虚拟机,不涉及数据库。

我需要弄清楚如何做的是处理用户提交 10 个节点(或任意数量)网络模型并且应用程序通过并建立网络(启动虚拟机)的情况,如果节点失败我希望能够对此做出反应。我希望能够回滚我的更改(即销毁所有创建的节点)。

有人告诉我,我需要查看“事务”,但我不确定当我不使用数据库时这是否适用于这种情况。

附带说明,如果用户发送该请求,我确实有逻辑来删除节点。

我的问题是——我该如何处理?

另外,对于这个问题,这是最好的堆栈溢出吗?

【问题讨论】:

  • 只有一个 StackOverflow,是的,这似乎是适合这个问题的 StackExchenge :) 很好,由方法。我的直觉是也利用现有的Transaction 框架——因为,正如您所暗示的,它旨在完全按照您在此处谈论的内容,但与数据库操作有关。我怀疑您可以对其进行调整以使其在这里也适合您。
  • 也许Computer Science StackExchange 是更好的选择。
  • 哎呀!抱歉,我的意思是“StackExchange”:)

标签: java spring transactions atomic


【解决方案1】:

您似乎确实在寻找事务行为,特别是原子性(“全有或全无”)。但通常“交易”意味着某些保证(特别是围绕 ACID 属性),在涉及分钟数量级的人类级别时间尺度的情况下,这些保证将难以或不可能实现。

可能“带有错误补偿的工作流程”是您在此处寻找的更多内容。

我会手动实现这一点,也许有工具支持(例如工作流引擎)。启动一个进程以生成您的网络,并跟踪当前进度,例如创建的虚拟机、正在进行的虚拟机等。如果有需要回滚的错误,则让另一个进程执行清理。清理过程本身的行为可能会失败,因此它可能会重试其各个步骤几次,然后生成报告“此清理步骤失败”。

如果涉及共享资源,那么您还需要实现某种隔离机制。有时这很容易——例如,DHCP 可以帮助您避免重复 IP。如果您正在更新 DNS 区域文件,那么您需要同步对该文件的访问以避免并发写入。等等。

【讨论】:

  • 我想我同意你的看法,威利·惠勒。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-09-17
  • 1970-01-01
  • 2015-09-16
  • 2014-01-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多