没有事务的回滚SQL

时间:2018-07-06 08:46:06

标签: c# sql-server rollback

我有一个Windows服务将数据上传到数据库,还有一个MVC应用程序,它利用了该服务。今天的工作方式是这样的:

Upload(someStuff);
WriteLog("Uploaded someStuff");
ReadData(someTable);
WriteLog("Reading someTable-data");
Drop(oldValues);
WriteLog("Dropping old values");


private void Upload(var someStuff)
{
    using(var conn = new connection(connectionstring))
    {
        //performQuery
    }
}

private void WriteLog(string message)
{
    using(var conn = etc..)
        //Insert into log-table
}

private string ReadData(var table)
{
    using etc..
        //Query
}
///You get the gist.

然后,客户端可以通过查询日志表来查看上传的当前状态。

如果某件事失败,我希望能够执行回滚。我首先想到的是使用BeginTransaction(),最后使用transaction.Commit(),但这会使我的状态消息表现不佳。它只是从“开始上传”开始,然后快进到最后一步,在“完成”之前要等待很长时间。

我希望用户能够看到该过程是否停留在某个特定步骤上,但是如果发生意外情况,我仍然希望能够执行完整的回滚。

我该如何实现?

编辑: 我的问题似乎不太清楚。如果我为日志记录做一个单独的连接,那确实可行。问题在于实际代码将以超快的速度执行,因此状态消息将通过得如此之快,以至于用户甚至在需要占用上载时间99%的最终“提交”消息之前甚至无法看到它们。

1 个答案:

答案 0 :(得分:2)

设计表,使其具有(P)结束,(A)强制(D)删除标志-然后执行更新,创建新记录,称为“待处理”状态P-您的最后一步是更改当前的“有效”到“已删除”,以及“待处理”到“有效”(您可以在事务中完成)。然后,您可以随时删除状态D(已删除)记录。

如果发生错误,“待定”记录可能会被删除