Как написать транзакцию для покрытия Перенос файла и Вставка записи в базу данных?
Я хочу иметь транзакцию для копирования файла, а затем вставить запись в базу данных.
что-то вроде инструкции ниже, но транзакция не распространяется на файл копирования.
Какое решение?
using (TransactionScope scope1 = new TransactionScope())
{
// Copy a file
fileMgr.Move(srcFileName, destFileName);
// Insert a database record
dbMgr.ExecuteNonQuery(insertSql);
scope1.Complete();
}
Ответы
Ответ 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% от синтаксиса для определения того, произошла ли ошибка при совершении транзакции, но я думаю, что это иллюстрирует концепцию