Подтвердить что ты не робот

Как написать транзакцию для покрытия Перенос файла и Вставка записи в базу данных?

Я хочу иметь транзакцию для копирования файла, а затем вставить запись в базу данных. что-то вроде инструкции ниже, но транзакция не распространяется на файл копирования. Какое решение?

using (TransactionScope scope1 = new TransactionScope())
{
    // Copy a file
    fileMgr.Move(srcFileName, destFileName);

    // Insert a database record
    dbMgr.ExecuteNonQuery(insertSql);

    scope1.Complete();
}
4b9b3361

Ответ 1

Попробуйте использовать .NET Transactional File Manager

Эта библиотека позволяет вам обертывать операции файловой системы в транзакции следующим образом:

// Wrap a file copy and a database insert in the same transaction
TxFileManager fileMgr = new TxFileManager();
using (TransactionScope scope1 = new TransactionScope())
{
    // Copy a file
    fileMgr.Copy(srcFileName, destFileName);

    // Insert a database record
    dbMgr.ExecuteNonQuery(insertSql);

    scope1.Complete();
} 

Ответ 2

В новых версиях Windows есть что-то вроде TxF (Transactional NTFS), которое вы можете использовать. Здесь приведен пример кода: WINDOWS VISTA - ВВЕДЕНИЕ TXF IN С# (ЧАСТЬ 2) - ИСПОЛЬЗОВАНИЕ СИСТЕМЫ. ТРАНСОРБЦИИ И DTC (я извините за закрытие колпачков, но заголовок страницы таков:-))

Вам нужно будет использовать MoveFileTransacted вместо DeleteFileTransactioned. После того, как вы находитесь в DTC, ваше SQL-соединение должно быть записано в него, и поэтому все должно быть одной большой транзакцией.

Ответ 3

вы можете вручную свернуть собственную транзакцию файла, если коммит не удался, переместите файл обратно в исходное местоположение

using (TransactionScope scope1 = new TransactionScope())
{
    // Copy a file
    fileMgr.Move(srcFileName, destFileName);

    try
    {
        // Insert a database record
        dbMgr.ExecuteNonQuery(insertSql);

        scope1.Complete();
    } catch (Exception) {
        fileMgr.Move(destFileName, srcFileName);
    }
}

Я не 100% от синтаксиса для определения того, произошла ли ошибка при совершении транзакции, но я думаю, что это иллюстрирует концепцию