gpt4 book ai didi

transactions - 执行顺序操作的最佳实践

转载 作者:行者123 更新时间:2023-12-01 09:40:37 25 4
gpt4 key购买 nike

同时执行几项任务的最佳方式是什么?如果一项任务失败,则不应完成下一项任务?我知道如果是数据库操作,那么我应该使用 Transactions 但我正在谈论不同类型的操作,如下所示:

所有任务都必须通过:

发送电子邮件存档报告在数据库中创建文件

在上述场景中,所有任务都必须通过,否则整个批处理操作必须回滚。

最佳答案

回滚很困难 - AFAIK,实际上只有两种方法可以解决。要么是 2 phase commit protocol , 或 compensating transactions .您确实必须找到一种方法来以其中一种方式组织您的任务。

通常,更好的想法是利用其他人的辛勤工作并使用已经内置 2PC 或补偿的技术。这就是 RDBMS 如此受欢迎的原因之一。

所以,具体细节取决于任务......但模式相当简单:

class Compensator {
Action Action { get; set; }
Action Compensate { get; set; }
}

Queue<Compensator> actions = new Queue<Compensator>(new Compensator[] {
new Compensator(SendEmail, UndoSendEmail),
new Compensator(ArchiveReportsInDatabase, UndoArchiveReportsInDatabase),
new Compensator(CreateAFile, UndoCreateAFile)
});

Queue<Compensator> doneActions = new Queue<Compensator>();
while (var c = actions.Dequeue() != null) {
try {
c.Action();
doneActions.Add(c);
} catch {
try {
doneActions.Each(d => d.Compensate());
} catch (EXception ex) {
throw new OhCrapException("Couldn't rollback", doneActions, ex);
}
throw;
}
}

当然,对于您的特定任务 - 您可能很幸运。

  • 显然,RDBMS 工作已经可以封装在事务中。
  • 如果您使用的是 Vista 或 Server 2008,那么您将获得 Transactional NTFS涵盖您的 CreateFile 场景。
  • 电子邮件有点棘手 - 我不知道它周围有任何 2PC 或补偿器(不过,如果有人指出 Exchange 有一个,我只会有点惊讶)所以我可能会使用 MSMQ编写通知并让订阅者接收并最终通过电子邮件发送。此时,您的事务实际上只涉及将消息发送到队列,但这可能已经足够了。

所有这些都可以参加System.Transactions交易,所以你的状态应该很好。

关于transactions - 执行顺序操作的最佳实践,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/168560/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com