无事务回滚 SQL

Rollback SQL without transaction

我有一个将数据上传到数据库的 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.

然后客户端可以通过查询日志看到当前上传的状态-table.

我希望能够在出现故障时执行回滚。我的第一个想法是使用 BeginTransaction(),最后是 transaction.Commit(),但这会使我的状态消息表现不佳。它只会从 "starting upload" 开始,然后快进到最后一步,在 "Done".

之前等待很长时间

我希望用户能够看到进程是否卡在某个特定步骤,但我仍然希望能够在发生意外情况时执行完整回滚。

如何实现?

编辑: 我的问题好像没说清楚。如果我为日志记录建立单独的连接,那确实可行。问题在于实际代码执行速度超快,因此状态消息传递得如此之快以至于用户甚至无法在最终 "committing" 消息之前看到它们,该消息将占用 99% 的上传-时间.

设计你的 table 使其有一个 (P)ending, (A)active (D)eleted 标志 - 然后执行更新,创建新记录称为 'pending' Status P - 您的最后阶段是将当前活动更改为已删除,将待处理更改为活动(您可以在事务中执行此操作)。在您有空的时候,您可以在某个时候删除状态 D(已删除)的记录。

如果出现错误,'pending' 记录可能会被删除