如何处理在使用Data.Acid时更改事件的实现

我有一个中等大小的应用程序,使用Data.Acid持久性,我遇到了一个情况,我需要更新下一个版本的服务器的一个Update事件的实现。 即我有类似的东西

 myUpdate :: Update MyState () myUpdate = <some outdated implementation> 

现在,显然我不能随意改变执行方式,因为它会破坏我的交易历史,所以我想知道人们通常如何处理这个问题。 我看到我的select是:

  1. 停止服务器。 为我的AcidState运行createCheckpoint 。 更新Event实施,然后重新启动服务器。 由于我们从一个新的快照加载,更改的Update不应该触发旧的事件。

  2. 使用新名称(如myUpdate_v2 )创build一个新的Update ,并更新我的服务器逻辑,使其只使用myUpdate_v2而不是原始的myUpdate

我认为这两种select都有其优点。 (1)更好,因为我不需要保留我的代码库中的旧function,但必须非常小心地为每个更新的服务器执行,否则我会冒损坏数据的风险。 (2)更安全(特别是如果我从模块的输出中删除旧的myUpdate ,所以我可以肯定,我不会意外地在任何地方使用旧的实现),但是它感觉有点难看。

有没有更好的方法来做到这一点? 我认为这是我一定会遇到的一个又一个长期项目,所以我想有一个很好的标准工作stream程来应用对我的事件实施的变化。

解决的办法是不要使用像“改变”这样的高阶函数。 酸状态(ACID保证,远程运行代码等)的好处是仅使用可串行数据的代价。 这个限制不太可能被解除。

通常这不是一个大问题; 只是专门化你的代码。 如果这不能削减它,也许你想保持你的状态在MVar。