无事务回滚 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' 记录可能会被删除
我有一个将数据上传到数据库的 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' 记录可能会被删除