【问题标题】:Rollback SQL without transaction无事务回滚 SQL
【发布时间】:2018-07-06 08:46:05
【问题描述】:

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

【问题讨论】:

  • 然后使用事务
  • 我想你想在一个事务中上传,以获得你的回滚能力,然后使用单独的连接来更新日志表
  • 您可以按照 JayV 的建议使用单独的连接进行上传和记录,也可以使用 WITH (NOLOCK) 从 MVC 应用程序读取日志。
  • 你为什么不设计你的表,让它有一个 (P)ending,(A)ctive (D)eleted 标志 - 然后执行更新,新记录被称为“待定”状态 P - 您的最后阶段是将当前活动更改为已删除,将待处理更改为活动(您可以在事务中执行此操作)。闲暇时,您可以在某个时间删除状态 D(已删除)记录。
  • @Cato 是的,这可能是一个不错的选择 =) 谢谢。如果您做出回答,我会将您标记为“已解决”。

标签: c# sql-server rollback


【解决方案1】:

设计您的表格,使其具有 (P)ending、(A)ctive (D)eleted 标志 - 然后执行更新,创建称为“待定”状态 P 的新记录 - 您的最后阶段是更改当前 Active 到 Deleted,以及 Pending 到 Active(您可以在事务中执行此操作)。闲暇时,您可以在某个时间删除状态 D(已删除)记录。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-07-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多