Откат SQL без транзакции - PullRequest
0 голосов
/ 06 июля 2018

У меня есть служба 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% времени загрузки.

1 Ответ

0 голосов
/ 06 июля 2018

Создайте свою таблицу так, чтобы она имела (P) окончание, (A) ctive (D) выборочный флаг - затем для выполнения обновления создаются новые записи, называемые «ожидающими» Status P - ваш самый последний этап - это изменение текущий активный в удаленный и ожидающий в активный (вы можете сделать это в транзакции). Затем вы можете в любое время удалить записи статуса D (удаленные).

В случае ошибки «ожидающая» запись может быть удалена.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...