【发布时间】: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