我在使用工作流程管理工具的团队中工作。我遇到了一个挑战,用户应该能够将流程中任何时候所做的更改回滚到过去的某个时间点。当然,收费可以处理它,但在这些活动期间可能进行的额外数据库调用必须手动回滚。
挑战在于存在多个并行路径并且外部数据库调用的排列不同。那么是否有框架或方法来跟踪这些数据库调用并回滚它们?
谢谢你,贾斯汀
我在使用工作流程管理工具的团队中工作。我遇到了一个挑战,用户应该能够将流程中任何时候所做的更改回滚到过去的某个时间点。当然,收费可以处理它,但在这些活动期间可能进行的额外数据库调用必须手动回滚。
挑战在于存在多个并行路径并且外部数据库调用的排列不同。那么是否有框架或方法来跟踪这些数据库调用并回滚它们?
谢谢你,贾斯汀
嗯,我不这么认为。
例如,在实体框架中,您拥有TRANSACTIONS
和ROLLBACK
功能,但这ROLLBACK
只会TRANSACTION
从这个开始(START TRANSACTION
-SQL语句)开始改变
然后,您将必须在多个并行路径中启动一个TRANSACTION
并做出决定COMMIT
或ROLLBACK
更改。但是在COMMIT
其他并行实例之前不会看到其他TRANSACTIONS
人还不会看到所做的更改COMMITED
。
我认为,您必须对您的应用程序/数据库进行一些重构,但这只是题外话提示。
提交给数据库的这些更改是否已经处于中间状态?这将是有问题的。因为其他用户可能已经根据提交的数据开始了操作。
我见过在提交之前支持 n 级撤消的系统(CSLA 这样做),但这是在内存中的对象模型级别。
您不会无限期地打开数据库事务以等待用户操作。
您需要回滚还是需要数据处于某种状态?我问,如果是后者,那么将您的记录设置回工作流程步骤 X 之前的值是一个问题。
有一种称为Momento 模式的设计模式,它以关键间隔拍摄对象的快照,并将该数据与数据库中的“当前”数据保持一致。这种类型的事务可以存储为您的对象的序列化并记录下来,因此您需要为您当前拥有的每个表创建一个历史表。
诀窍是从 Memento 事务中恢复您的对象,将数据保存回您的标准表。