У меня есть служба 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()
, но это заставило бы мое сообщение о статусе вести себя плохо. Он просто перейдет от «начала загрузки» и затем переместится вперед к последнему шагу, где он будет долго ждать до «Готово».
Я хочу, чтобы пользователь мог видеть, застрял ли процесс на каком-то конкретном шаге, но я все еще хочу иметь возможность выполнить полный откат, если произойдет что-то непредвиденное.
Как мне этого добиться?
Edit:
Я, кажется, не был ясно в моем вопросе. Если бы я сделал отдельное соединение для регистрации, это действительно работало бы. Проблема в том, что реальный код будет выполняться очень быстро, поэтому сообщения о состоянии будут проходить так быстро, что пользователь даже не сможет увидеть их до окончательного «принятия» сообщения, которое займет 99% времени загрузки.