2010-06-08 88 views
0

我在使用工作流管理工具的团队中工作。我遇到了一个挑战,用户应该能够将流程中的任何时间所做的更改回滚到过去的某个时间点。当然,收费可以处理它,但在这些活动期间可能发生的额外数据库调用必须手动回滚。回滚数据库更改

挑战在于存在多个并行路径,并且存在外部数据库调用的不同排列。那么是否有框架工作或跟踪这些数据库调用并将它们回滚的方法?

谢谢你, 贾斯汀

+0

如果你有一个流A改变了记录,流B可能会改变同一个记录,并且谁开始流A想要回滚...我会说你的搞砸了。如果在流程处理过程中上帝禁止一个或多个其他流程(C,D,E ..)被启动,其中一个流程后来回滚...听起来像一团糟。您可能想与那个项目赞助商交谈。 – NotMe 2010-06-08 21:46:00

+0

你是否独立于数据谈论模式更改?还是数据更改?或两者? – Aren 2010-06-08 21:47:36

回答

2

嗯,我不这么认为。

实体框架比如你有TRANSACTIONSROLLBACK功能,但这种ROLLBACK只有在这个TRANSACTION从这个开始的begining变化(START TRANSACTION - SQL语句

然后,你将必须在多个并行路径开始TRANSACTION并作出COMMITROLLBACK的更改决定。但在COMMIT之前,其他并行实例不会看到其他TRANSACTIONS中的变更,他们不会变为COMMITED

我认为,你必须做一些重构(refactorization)应用/数据库,但是这仅仅是offtopic提示。

+0

@Aren B。我只是在谈论数据变化。 – justin 2010-06-08 22:00:46

0

这些更改是否已提交给数据库已处于中间状态?这将是有问题的。由于其他用户可能已根据已提交的数据启动操作。

我已经看到在提交之前支持n级撤销的系统(CSLA执行此操作),但这是在内存中的对象模型级别。

您不会无限期地等待用户操作持续打开数据库事务。

0

你需要回滚还是你需要数据处于某种状态?我问,如果后者是这种情况,那么它是一个问题或将您的记录设置回工作流程步骤X之前的值。

有一种设计模式,称为Momento Pattern,它为您的对象创建快照按照一定的时间间隔,除了数据库中的“当前”数据之外,还会保存这些数据。这种类型的事务可以存储为对象的序列化并进行记录,因此您需要为当前拥有的每个表创建一个历史记录表。

诀窍是从Memento事务中恢复对象,将数据保存回标准表。