C# 如果前两个操作成功完成,但第三个事务未能完成,如何回滚操作
我正在开发.net应用程序,其中有三个操作需要一次性执行。首先,将记录插入表中(我调用存储过程将记录插入表中),然后将第一封邮件发送给管理员,第二封邮件发送给填写表单的用户。。我不知道这三项行动如何能成功进行。如果前两个操作已完成,而最后一个操作无法完成,则必须回滚。我正在考虑使用事务来执行此操作,如果任何操作未完成,则使用try-catch-exception回滚。但我的疑问是,如果记录被插入,第一封邮件被发送,第二封邮件发送失败,第一封邮件发送是否被回滚!!!还有其他方法吗?首先,如果您可以将不同类型的逻辑分离为更模块化的方法,那么关注点的分离总是更好的。一个数据库操作不应该依赖于电子邮件发送操作,不同的模块用于不同的目的,还可以查看依赖注入以便于测试 不管怎样,如果我没弄错你的问题,我相信你想要这样的东西C# 如果前两个操作成功完成,但第三个事务未能完成,如何回滚操作,c#,stored-procedures,gmail,C#,Stored Procedures,Gmail,我正在开发.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;
}
}
}
也许你应该通过使用事件命令在交易范围之外发送电子邮件?你能告诉我哪个事件可以让我这样做吗,因为我是新手?还有,我如何处理并发性。。如果插入了记录但电子邮件发送失败怎么办??