gpt4 book ai didi

c# - 如何在单个事务下执行多个操作

转载 作者:行者123 更新时间:2023-11-30 23:13:01 25 4
gpt4 key购买 nike

我有一个场景,它需要在表中添加一条记录,然后 - 如果添加了记录,则在云上创建一个资源,如果资源是在云上创建的,则使用资源标识符更新表中的记录。所以,它们是 3 个操作,我想在其中任何一个不成功时恢复所有操作。

我们一次性拥有多个数据库操作的 TransactionScope,但我想知道如何实现这一点?感谢您的帮助!

编辑

PS:可能有任意数量的类似操作 - 比如说 10 个或更多个序列,它们甚至可能与数据库操作无关。他们可能只是按顺序创建 10 个文件 - 因此当任何文件创建失败时 - 所有之前的文件都应该被删除/撤消。

最佳答案

使用命令模式怎么样?它可能不是完美的命令模式实现,但非常接近。见下文:

public interface ICommand {
ICommandResult Execute();
ICommandResult Rollback();
}

public interface ICommandResult {
bool Success { get; set; }
object Data { get; set; }
Exception Error { get; set; }
}

public class CommandResult : ICommandResult {
public bool Success { get; set; }
public object Data { get; set; }
public Exception Error { get; set; }
}

public class AddToDBCommand : ICommand {
private ICommandResult result;
private int newRecordId;

public AddToDBCommand(<params_if_any>) {
result = new CommandResult();
}

public ICommandResult Execute() {
try {
// insert record into db
result.Success = true;
result.Data = 10; // new record id
}
catch (Exception ex) {
result.Success = false;
result.Error = ex;
}
return result;
}

public ICommandResult Rollback() {
try {
// delete record inserted by this command instance
// use ICommandResult.Data to get the 'record id' for deletion
Console.WriteLine("Rolling back insertion of record id: " + result.Data);
// set Success
}
catch(Exception ex) {
// set Success and Error
// I'm not sure what you want to do in such case
}
return result;
}
}

类似地,您将创建用于创建云资源和更新数据库中记录的命令。在主代码中,您可以保存 ICommand 对象的集合并执行每个对象。

var commands = new List<ICommand>
{
new AddToDBCommand(<params_if_any>),
new AddToCloudCommand(<params_if_any>),
new UpdateInDBCommand(<param_if_any>)
};

然后在循环中可以调用Execute,如果返回Success = false则将当前命令索引记录在collection中,在调用Rollback<的同时向后循环 在每个命令上。

关于c# - 如何在单个事务下执行多个操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43796988/

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