使用pickle进行内存中的“事务”?

时间:2011-02-13 19:50:26

标签: python transactions pickle undo

用户可以执行操作,这可能会触发相关操作(它们本身可能具有相关操作),并且如果用户取消相关操作,我希望能够取消整个操作。

我看到这种做法的典型方式是撤销堆栈的一些变体,每个动作都需要知道如何撤消自身,然后如果取消子动作,撤销的级联就会向上移动。有时编写撤消方法很棘手,并且在上下文中并不总是有足够的信息来正确地知道如何以孤立的方式撤消操作。

我只是想到一个(可能)更简单的方法,只是pickle程序的(相关部分)的状态,然后取消只会恢复到它以前的状态,而不需要创建单独的撤消每个操作的逻辑。

有人试过吗?有什么值得注意的吗?有什么理由不这样做吗?

编辑:从属操作必须在父操作之后发生(甚至是否存在依赖操作可能取决于父操作的结果),因此在执行任何操作之前只检查所有依赖关系不是一个选项。我想你可以说一个动作会触发其他动作,但如果其中一个触发动作无法执行,那么就不会发生任何动作。

2 个答案:

答案 0 :(得分:1)

好吧,正如你所提到的那样,数据设计是松散耦合的,所以你不认为如果它在内存中就需要腌制它。只需复制所有相关变量,transaction.abort()只需将其复制回来,然后transaction.commit()就会删除数据副本。

有一些问题,但没有一个问题,你没有使用泡菜解决方案。

答案 1 :(得分:1)

如果状态的所有元素都是可序列化的(通常是可以的话),你可以使用pickle存储你的状态。不这样做的唯一原因是:

  • 如果你必须存储指向未保存状态的任何对象的指针,那么在执行撤消操作后你会遇到这些指针的问题。

  • 这种方法可能很昂贵,具体取决于您所在州的规模。

此外,您可以使用zip()来降低内存使用量,以换取提高CPU使用率。