C# 如果前两个操作成功完成,但第三个事务未能完成,如何回滚操作

C# 如果前两个操作成功完成,但第三个事务未能完成,如何回滚操作,c#,stored-procedures,gmail,C#,Stored Procedures,Gmail,我正在开发.net应用程序,其中有三个操作需要一次性执行。首先,将记录插入表中(我调用存储过程将记录插入表中),然后将第一封邮件发送给管理员,第二封邮件发送给填写表单的用户。。我不知道这三项行动如何能成功进行。如果前两个操作已完成,而最后一个操作无法完成,则必须回滚。我正在考虑使用事务来执行此操作,如果任何操作未完成,则使用try-catch-exception回滚。但我的疑问是,如果记录被插入,第一封邮件被发送,第二封邮件发送失败,第一封邮件发送是否被回滚!!!还有其他方法吗?首先,如果您可以

我正在开发.net应用程序,其中有三个操作需要一次性执行。首先,将记录插入表中(我调用存储过程将记录插入表中),然后将第一封邮件发送给管理员,第二封邮件发送给填写表单的用户。。我不知道这三项行动如何能成功进行。如果前两个操作已完成,而最后一个操作无法完成,则必须回滚。我正在考虑使用事务来执行此操作,如果任何操作未完成,则使用try-catch-exception回滚。但我的疑问是,如果记录被插入,第一封邮件被发送,第二封邮件发送失败,第一封邮件发送是否被回滚!!!还有其他方法吗?

首先,如果您可以将不同类型的逻辑分离为更模块化的方法,那么关注点的分离总是更好的。一个数据库操作不应该依赖于电子邮件发送操作,不同的模块用于不同的目的,还可以查看依赖注入以便于测试

不管怎样,如果我没弄错你的问题,我相信你想要这样的东西

public delegate void CustomEventHandler(object sender, CustomEventArgs e);

public class CustomEventArgs : EventArgs
{
    public enum EventTypes
    {
        Success,
        Error
    }

    public CustomEventArgs(string s, EventTypes type)
    {
        msg = s;
        this.type = type;
    }
    private readonly string msg;

    public string Message
    {
        get { return msg; }
    }

    private readonly EventTypes type;

    public EventTypes Type
    {
        get { return type; }
    }
}

public class TransactionManager
{
    public event CustomEventHandler CustomEvent;

    public void PerformTransaction()
    {
        try
        {
            using (var scope = new TransactionScope())
            {
                //Perform your workload

                scope.Complete();

            }

            if (CustomEvent != null)
                CustomEvent(this,
                    new CustomEventArgs("Transaction performed successfully message",
                        CustomEventArgs.EventTypes.Success));
        }
        catch (Exception exception)
        {
            if (CustomEvent != null)
                CustomEvent(this,
                    new CustomEventArgs(exception.Message, CustomEventArgs.EventTypes.Error));                
        }
    }

}

public class Engine
{

    public void PerformWorkload()
    {
        var tm = new TransactionManager();

        tm.CustomEvent += transaction_CustomEvent;

        tm.PerformTransaction();

    }

    private void transaction_CustomEvent(object sender, CustomEventArgs e)
    {
        //Simulate send operation successful mail
        switch (e.Type)
        {
            case CustomEventArgs.EventTypes.Error:
                //Send error mail
                break;
            case CustomEventArgs.EventTypes.Success:
                //Send success email
                break;
        }
    }
}

也许你应该通过使用事件命令在交易范围之外发送电子邮件?你能告诉我哪个事件可以让我这样做吗,因为我是新手?还有,我如何处理并发性。。如果插入了记录但电子邮件发送失败怎么办??