为了避免因未知错误而代码已经执行,导致数据丢失或更改的情况,事物给我们提供了很好的解决的方案。
事物:简而言之就是,如果有任何一个方法执行出错,那么整个的都不会执行,数据也不会有任何变化。下面是一个小案例:
public ActionResult UpdateOperationLogID()
{
string operationLogID = "XXXX-XXX-XXX-XXXX";
ServiceConfig sc = new ServiceConfig();
//指定事务类型
sc.Transaction = TransactionOption.Required;
//设置启动跟踪
sc.TrackingEnabled = true;
//创建一个上下文,该上下文的配置由作为 cfg 参数传递的 ServiceConfig 对象来指定。
//随后,客户端和服务器端的策略均被触发,如同发生了一个方法调用。
//接着,新的上下文被推至上下文堆栈,成为当前上下文
ServiceDomain.Enter(sc);
try
{
/*这里我定义了两个更新方法,第一个方法可以正常执行,但第二个方法就会报错,这个时候,其实我们第一个方法的更新操作也不会执行。而会直接到回滚里,数据不会有任何变化*/
new UserCarBindBLL().UpdateOperationLogID(operationLogID);//1
new UserCarBindBLL().UpdateOperationLogID("259445");//2
//提交事务
ContextUtil.SetComplete();
return SuccessResult(111);
}
catch (Exception)
{
//回滚事务
ContextUtil.SetAbort();
throw;
}
finally
{
//触发服务器端的策略,随后触发客户端的策略,如同一个方法调用正在返回。
//然后,当前上下文被弹出上下文堆栈,调用 Enter 时正在运行的上下文成为当前的上下文。
ServiceDomain.Leave();
}
}