我有一个中等大小的应用程序,使用Data.Acid持久性,我遇到了一个情况,我需要更新下一个版本的服务器的一个Update事件的实现。 即我有类似的东西 myUpdate :: Update MyState () myUpdate = <some outdated implementation> 现在,显然我不能随意改变执行方式,因为它会破坏我的交易历史,所以我想知道人们通常如何处理这个问题。 我看到我的select是: 停止服务器。 为我的AcidState运行createCheckpoint 。 更新Event实施,然后重新启动服务器。 由于我们从一个新的快照加载,更改的Update不应该触发旧的事件。 使用新名称(如myUpdate_v2 )创build一个新的Update ,并更新我的服务器逻辑,使其只使用myUpdate_v2而不是原始的myUpdate 。 我认为这两种select都有其优点。 (1)更好,因为我不需要保留我的代码库中的旧function,但必须非常小心地为每个更新的服务器执行,否则我会冒损坏数据的风险。 (2)更安全(特别是如果我从模块的输出中删除旧的myUpdate ,所以我可以肯定,我不会意外地在任何地方使用旧的实现),但是它感觉有点难看。 有没有更好的方法来做到这一点? 我认为这是我一定会遇到的一个又一个长期项目,所以我想有一个很好的标准工作stream程来应用对我的事件实施的变化。