我正在努力将事件序列分组到一个原子事务中。
考虑一个以酸态存储的Map
,并假设您要实现Data.Map.alter
。 接受 maybe-value 并返回 1 的函数不能存储在更改日志中,因此无法定义酸性事件Alter
。 但是,如果我编写一个函数,调用query st Lookup ...
来查找旧值,然后update st Insert ...
编写新值(或删除旧值),则存在争用条件,我可能会破坏中间发生的更新中的信息。
在 https://github.com/acid-state/acid-state/pull/48 中,我使用了额外的MVar
来进行手动锁定,但必须有更好的解决方案。
有什么想法吗?
这里的酸态作者。
解决方案是不要使用像"alter"这样的高阶函数。酸状态的好处(ACID保证,远程运行代码等)的代价是仅使用可序列化数据。这一限制不太可能被取消。
通常这不是一个大问题;只需专门化您的代码即可。如果这不能解决问题,也许您想将您的状态保持在 MVar 中。
干杯 大卫。